Пример 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!