Написал оконное приложение выбирающее файл для открытия Главная задача передать по методам 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(); }
}
|
|