Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация потоков обработки оконного приложения, проблема с ожиданием ввода 
:(
    Опции темы
milvus
Дата 23.12.2012, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.12.2012

Репутация: нет
Всего: нет



Написал оконное приложение выбирающее файл для открытия
Главная задача передать по методам get пути к выбранному файлу!
Но проблема в том что видимо основная программа выполняется параллельно!
Код

import java.io.FileNotFoundException;//для учета этой ошибки
import java.io.IOException;//для учета этой ошибки
import java.awt.*;
import java.awt.event.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;


    // =======================================
    // Class FrameWindow- с немного измененными методами от дочернего класса FRAME
    // =======================================
public class FrameWindow extends Frame 
      implements ActionListener, WindowListener // первый для работы методов окна второй для закрытия окна

      {
      /**
         * 
         */
        private static final long serialVersionUID = 8385931678380535778L;
      
      TextArea ta0;// ссылка на многострочный редактор текста путь файла
      TextArea ta1;// ссылка на многострочный редактор текста имя файла
      TextArea ta2;// ссылка на многострочный редактор текста содерж файла

      MenuBar mb;// ссылка на ленту меню
      
      Menu mFile;// ссылки на главное меню
      MenuItem miOpen;//и ссылки на разделы этого меню
      MenuItem miSave;
      MenuItem miExit;
      
      FileDialog fdlg;//ссылка на стандартную диал. панель выбора файла
      
      String _directory;// полученные параметры выбора
      String _file;
      String _sdirectory;// параметры для сохранения файла
      String _sfile;      
      
      boolean _flag = false;
      // ============================================
      // КОНСТРУКТОР FrameWindow - рисует окно должен сначала идти в конструктор родительского класса!?
      // ============================================
      public FrameWindow(String szTitle)
      {
          
        super(szTitle);//параметр title
        setSize(800, 600);// размер
        
        mb = new MenuBar();
        mFile = new Menu("File"); // набор строк в меню file
        
        miOpen = new MenuItem("Open...");
        mFile.add(miOpen);
        
        miSave = new MenuItem("Save As...");
        mFile.add(miSave);
        
        mFile.add("-");// разделительная черта в меню
        
        miExit = new MenuItem("Exit");
        mFile.add(miExit);
        
        mb.add(mFile); // добавление набранного меню файл в ленту меню
        
        miOpen.addActionListener(this);//обработчики событий для строк меню
        miSave.addActionListener(this);//при выборе некотрой сторки управление передается методу actionPerformed
        miExit.addActionListener(this);
        
        setMenuBar(mb);//конструктор подключает меню к окну приложения
        
        this.addWindowListener(this);// подключение методов для закрытия
        ta0 = new TextArea(3, 30);// текстовое поле        
        ta1 = new TextArea(1, 30);// текстовое поле
        ta2 = new TextArea(10, 30);// текстовое поле
        
        setLayout(new BorderLayout());
        add("North", ta0);
        add("Center", ta1);
        add("South", ta2);
      }

      // ============================================
      // actionPerformed - обрабатывает выбор любого пункта меню
      // ============================================
      public void actionPerformed(ActionEvent e)
      {
        if(e.getSource().equals(miOpen)) // нажатие на меню open
        {
         fdlg = new FileDialog(this, "Open file", FileDialog.LOAD); // означает что открываем для чтения файл
         fdlg.setVisible(true);
          
         _directory = fdlg.getDirectory();// полученные параметры выбора
         _file = fdlg.getFile();
         _flag = true; // означает что файл выбран и можно работать с путем к нему!
          
         ta0.append(fdlg.getDirectory());
         ta1.append(fdlg.getFile());
         /*взять содержимое файла и поместить в поле редактора*/
         try 
         {    
             InputStream f = new FileInputStream(_directory + _file);// открываем файл сразу для чтения    
  
             int size = f.available();    // размер файла
             byte ValueOfFile = -1;        // значение байта файла для проверки где заканчивается служебная инфа файла (<0)

             /*переписать в буфер из файла*/
             for(int i=0; (i< size); i++)    // пройдем по всему файлу и запишем то что там есть!
                 if ((ValueOfFile = (byte) f.read())>= 0 )
                 {
                  ta2.append("" + (char)ValueOfFile);
                 }
             
             f.close(); 
         } 
         catch (FileNotFoundException  e1) 
         {
             // TODO Auto-generated catch block
             e1.printStackTrace();
         }          
         catch (IOException e1) 
         {
             // TODO Auto-generated catch block
             e1.printStackTrace();
         }    
        }
        
        else if(e.getSource().equals(miSave))// нажатие на save
        {
         fdlg = new FileDialog(this, "Save file as...", FileDialog.SAVE);
         fdlg.setVisible(true);
      /*
          ta1.append("Save as: " + 
            fdlg.getDirectory() +
            fdlg.getFile() + "\n");
      */
         _sdirectory = fdlg.getDirectory();
         _sfile = fdlg.getFile();
         String FileText;
         try 
         {
                OutputStream f = new FileOutputStream(_sdirectory + _sfile);
                FileText = ta2.getText();
                for (int i=0; i<FileText.length();i++)
                    f.write((byte)FileText.charAt(i));//побайтово записываем в новый файл!
                f.close();
         } 
         catch (FileNotFoundException  e1) 
         {
             // TODO Auto-generated catch block
             e1.printStackTrace();
         }          
         catch (IOException e1) 
         {
             // TODO Auto-generated catch block
             e1.printStackTrace();
         }
        
        }
          
        else if(e.getSource().equals(miExit))
        {
          setVisible(false);
          System.exit(0);
        }
      }
      
      // ============================================
      // windowClosing - обрабатывает закрытие файла
      // ============================================
      public void windowClosing(WindowEvent e)
      {
        setVisible(false);
        System.exit(0);
      }
      
      public void windowOpened(WindowEvent e) {}
      public void windowClosed(WindowEvent e) {}
      public void windowIconified(WindowEvent e) {}
      public void windowDeiconified(WindowEvent e) {}
      public void windowActivated(WindowEvent e) {}
      public void windowDeactivated(WindowEvent e) {}

      
      /*РЕЗУЛЬТАТЫ ВЫБОРА ФАЙЛА*/
    public String getDirectory() {
            return _directory;
        }
    public String getFile() {
            return _file;
        }

    public boolean isFlag() {
        return _flag;
    }
    
    }


Основная программа в которой создается объект данного класса
Код

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;




public class StrFileProg 
{
    
// метод для чтения инф из файла!
    public static byte getlnput(String path)[] throws Exception 
    { 
        byte buffer[] = new byte[12]; 
        /*заполнить буфер со ввода*/
        /*
        for (int i=0; i< 12; i++) 
            { 
                buffer[i] = (byte) System.in.read(); 
            } 
        */
        /*взять его из файла*/
        InputStream f = new FileInputStream(path); // открываем файл сразу для чтения    

        /*если прочитано из файла меньше байт чем размер буфера то продолжать читать дальше*/

        int currBuffByte=0;// переменная показывающая сколько символов мы прочитали
        int size = f.available();    // размер файла
        byte ValueOfFile = -1;        // значение байта файла для проверки где заканчивается служебная инфа файла (<0)

        if (f.markSupported())    // если этот поток поддерживает маркеры, а этот не поддерживает
            f.mark(100);    // запоминаем все прочтенное с этого момента и по команде rset виртуально снова читаем эти данные но уже из созданного методом буфера, параметр говорит нам сколько максимум символов можно запомнить!
        
        /*переписать в буфер из файла*/
        for(int i=0; (i< size) && (currBuffByte < buffer.length) ; i++)    // пройдем по всему файлу и запишем то что там есть!
            if ((ValueOfFile = (byte) f.read())>= 0 )
            {
                buffer[currBuffByte] = ValueOfFile;
                currBuffByte++;    
            }    
        /*если не весь буфер заполнен то повторить уже записанное*/
        if( currBuffByte < buffer.length) // провераям хватило ли информации в файле чтоб заполнить буфер, -1 так как 0 элемент уже установили!
        {
            /*сколько уже записано при входе
             * нужно для циклического заполнения путем взятия остатка*/
             int entered = currBuffByte;    
             while (currBuffByte < buffer.length)
             {

                 //if (buffer[reads] > 0)
                     buffer[currBuffByte] = buffer[currBuffByte % entered];// берем и приравниваем циклически следующие члены буфера к уже заполненным за одно отсортироваваем служебное содержание файла (<0)
                     currBuffByte++;
             }

             if (f.markSupported())
                 f.reset(); // вернет каретку на начало файла, точнее в тот момент, когда был вызван mark
        }        
        
        f.close();            
        return buffer; 
        }

    /**
     * @param <frameWindow>
     * @param args
     */






    public static void main(String[] args)  throws Exception 
    {
        
    /*ОКНО ВЫБОРА ФАЙЛА*/
        FrameWindow frame = new FrameWindow("File select");    // класс потомок класса Frame
        frame.setVisible(true);

    /*ЧТЕНИЕ ФАЙЛА*/
        int size; 

тут я пытался сделать паузу до выбора файла!
но можно как нибудь правильнее организовать ожидание ввода в окно!
Код

        while (!frame.isFlag() )
        {
        
            System.out.println("Wait...") ;
        }
        InputStream f = new FileInputStream(frame.getDirectory() + frame.getFile() ); // открываем файл сразу для чтения
        size = f.available(); // сколько еще доступно байт для чтения
        System.out.println("Total Available Bytes: " + size); 
        System.out.println("First 1/4 of the file: read()"); 
        for (int i=0; i < size/4; i++) 
            /* // прочитаем первые 1/4 числа байт файла
             * причем выход переводит byte в int от 0 до 255 */
            System.out.print((char) f.read()); 

        System.out.println("\nTotal Still Available: " + f.available()); 
        System.out.println("Reading the next 1/8: read(b[])"); 
        byte b[] = new byte[size/8]; //массив байтов длинной 1/8 файла
        
/* чтение файла в массив байт
 * возвращает число помещенных байт причем не больше длинны массива
 * если возвращается -1 то данных для чтения нет или достигнут конец файла!
 * */
        if(f.read(b) != b.length) 
                System.err.println("Something bad happened"); 
        
        String tmpstr = new String(b, 0,0); 
        System.out.println(tmpstr); 
        System.out.println("Still Available: " + f.available()); 
        System.out.println("Skipping another 1/4: skip()"); 
        f.skip(size/4); 
        System.out.println( "Still Available: " + f.available()); 
        System.out.println("Reading 1/16 into the end of array"); 
        /* поместить прочитанные байты в конец массива буфера!*/
        if (f.read(b, b.length-size/16, size/16) != size/16) 
            System.err.println("Something bad happened"); 
        System.out.println("Still Available: " + f.available()); 
        f.close(); 
        
    /*ЗАПИСЬ ФАЙЛА*/
        byte buf[] = getlnput(frame.getDirectory() + frame.getFile()); // загрузить информацию напримр из файла выбранного ранее
        OutputStream f0 = new FileOutputStream("out1.txt"); 
        OutputStream f1 = new FileOutputStream("out2.txt"); 
        OutputStream f2 = new FileOutputStream("out3.txt"); 
        for (int i=0; i < 12; i += 2) 
            { 
                f0.write(buf[i]); // цикл с 0 по 12 байт но через 1
            } 
        f0.close(); 
        f1.write(buf); 
        f1.close(); 
        f2.write(buf, 12/4,12/2); // читать начиная с 3 байта 6 байт
        f2.close();
        
    } 

}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.