Пример 6.2. Определение свойств файла и каталога



class FileTest {

public static void main(String[] args) throws IOException { 

   File f = new File("FileTest.java"); 

   System.out.println();

   System.out.println("File \"" + f.getName() +

              "\" " +(f.exists()? "is " : "isn't ") + "existed");

   System.out.println("You " + (f.canRead()? "can " : "can't ") + "read this file"); 

   System.out.println("You " + (f.canWrite()? "can " : "can't ") + "write to this file"); 

   System.out.println("File size is " + f.length() + " B");

   System.out.println();

   File d = new File("C:"); 

   System.out.println("Content of " + d.getPath()); 

   if (d.exists() && d.isDirectory()) { 

         String[] s = d.list(); 

       for (int i = 0; i < s.length; i++)

           System.out.println(s[i]); 

   } 

}

}

 

Буферизованный ввод/вывод. Операции ввода/вывода по сравнению с операциями в оперативной памяти выполняются очень медленно. Для компенсации в оперативной памяти выделяется некоторая промежуточная область — буфер, в которой постепенно накапливается информация. Когда буфер заполнен, его содержимое быстро переносится процессором, буфер очищается и снова заполняется информацией.

Для этой цели есть четыре специальных класса BufferedXХХ, перечисленных выше. Они присоединяются к потокам ввода/вывода как "переходное кольцо", например:

InputStreamReader isr = new InputStreamReader(fis, "KOI8_R"));

FileWriter fw = new FileWriter("ch8.txt", true);

BufferedReader br = new BufferedReader(isr);

BufferedWriter bw = new BufferedWriter(fw);

Поток примитивных  типов Java. Класс DataOutputstream позволяет записать данные простых типов Java в выходной поток байтов методами writeBoolean(boolean b), writeByte(int b), writeShort(int h), writeChar(int c), writeInt(int n), writeLong(long 1), writeFloat(float f), writeDouble(double d).

Кроме того, метод writeBytes(string s) записывает каждый символ строки s в один байт, отбрасывая старший байт кодировки каждого символа Unicode, а метод writeChars(string s) записывает каждый символ строки s в два байта, первый байт — старший байт кодировки Unicode, так же, как это делает метод writeChar().

Класс DataInputStream преобразует входной поток байтов типа InputStream, составляющих данные простых типов Java, в данные этого типа. Данные из этого потока можно прочитать методами readBoolean(), readByte(), readShort(), readChar(), readlnt(), readLong(), readFloat(), readDouble(), возвращающими данные соответствующего типа.

Кроме того, методы readUnsignedByte() и readUnsignedShort () возвращают целое типа int, в котором старшие три или два байта нулевые, а младшие один или два байта заполнены байтами из входного потока.

Программа в примера 6.3 записывает в файл fib.txt числа Фибоначчи, а затем читает этот файл и выводит его содержимое на консоль. Для контроля записываемые в файл числа тоже выводятся на консоль.

Пример 6.3. Ввод/вывод данных

class DataPrWr {

public static void main(String[] args) throws IOException { 

   DataOutputStream dos = new DataOutputStream(

new FileOutputStream("fib.txt")); 

   int a = 1, b = 1, с = 1; 

   for (int k = 0; k < 40; k++)   { 

       System.out.print(b + " "); 

       dos.writeInt(b); 

       a = b; b = с; с = a + b; 

   }

   dos.close();

   System.out.println("\n");

   DataInputStream dis = new DataInputStream(

new FileInputStream("fib.txt")); 

   while(true) {

       try {

           a = dis.readInt(); 

           System.out.print(a + " "); 

       }

       catch(IOException e) { 

           dis.close();

           System.out.println("\nEnd of file"); 

           System.exit (0); 

       } 

   }

}

}

 

Обратите внимание на то, что попытка чтения за концом файла выбрасывает исключение класса IOException, его обработка заключается в закрытии файла и окончании программы.

 

Прямой доступ к файлу. Если необходимо интенсивно работать с файлом, записывая в него данные разных типов Java, изменяя их, отыскивая и читая нужную информацию, то лучше всего воспользоваться методами класса RandomAccessFile.

В конструкторах этого класса

RandomAccessFile(File file, String mode);

RandomAccessFile(String fileName, String mode);

аргументом mode задается режим открытия файла. Это может быть строка "r" — открытие файла только для чтения, или "rw" — открытие файла для чтения и записи.

Этот класс собрал все полезные методы работы с файлом. Он содержит все методы классов DataInputStream и DataOutputStream, кроме того, позволяет прочитать сразу целую строку методом readLine() и отыскать нужные данные в файле.

Байты файла нумеруются, начиная с 0, подобно элементам массива. Файл снабжен неявным указателем (file pointer) текущей позиции. Чтение и запись производится, начиная с текущей позиции файла. При открытии файла конструктором указатель стоит на начале файла, в позиции 0. Текущую позицию можно узнать методом getFilePointer(). Каждое чтение или запись перемещает указатель на длину прочитанного или записанного данного. Всегда можно переместить указатель в новую позицию, роз методом seek(long pos).

Каналы обмена информацией. В пакете java.io есть четыре класса Pipedxxx, организующих обмен информацией между потоками - Thread.

В одном подпроцессе-потоке — источнике информации — создается объект класса PipedWriter или PipedOutputStream, в который записывается информация методами write() этих классов.

В другом подпроцессе-потоке — приемнике информации — формируется объект класса PipedReader или PipedInputStream. Он связывается с объектом-источником с помощью конструктора или специальным методом connect(), и читает информацию методами read().

Источник и приемник можно создать и связать в обратном порядке.

Так создается однонаправленный канал(pipe) информации. На самом деле это некоторая область оперативной памяти, к которой организован совместный доступ двух или более подпроцессов. Доступ синхронизируется, записывающие процессы не могут помешать чтению.

Если надо организовать двусторонний обмен информацией, то создаются два канала.

В примере 6.4 метод run() класса Source генерирует информацию, для простоты просто целые числа k, и передает ее в канал методом pw.write(k). Метод run() класса Target читает информацию из канала методом pr.read(). Концы канала связываются с помощью конструктора класса Target.

 


Дата добавления: 2018-04-15; просмотров: 266; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!