WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Как лучше всего осуществлять Ввод/Вывод?

Как лучше всего осуществлять Ввод/Вывод?


Дата публикации: 17-03-2013

Java программы довольно часто осуществляют чтение из или запись в файлы. Конечно, возникает естественный вопрос: "Существует ли самый удобный способ выполнения этого?" Эта статья дает вам некоторые советы для облегчения этого процесса.

1. Вы хотите работать с байтами или символами?
Если вы хотите работать с символьным вводом/выводом, типа текстовых файлов, то лучше всего использовать классы reader и writer.

Классы потока ввода/вывода - хороший выбор для работы с байтовым уровнем или двоичными данными, типа файлов изображения.

2. Выберите наиболее подходящий класс, который удовлетворяет вашим требованиям.
Часто мы используем классы, которые мы знаем. Фактически, существует лучший класс, который удовлетворяет нашим требованиям. Если вы не уверены, по крайней мере, посмотрите документацию API, чтобы увидеть, есть ли более подходящий класс. Далее показаны несколько классов, используемых для специфических потребностей:

a. Используйте DataInputStream и DataOutputStream для чтения и записи примитивных типов данных.
b. Используйте LineInputStream или LineNumberReader для слежения за номерами строк при чтении.
c. Используйте PipedInputStream и PipedOutputStream, или PipedReader и PipedWriter, чтобы направить выход одной программы или вычислительного потока обслуживать вход другой программы.
d. Используйте ByteArrayInputStream и ByteArrayOutputStream, или CharArrayReader и CharArrayWriter для записи в или чтения из массивов в памяти.
3. Используйте буферизированные потоки или буферизированные reader/writer для достижения большей эффективности.
Так как буферизированные классы буферизируют данные при чтении или записи, они уменьшают количество доступов, требуемых для источника данных. Вы всегда должны пытаться использовать их для достижения большей эффективности, пока не появится более удобный способ.

Далее показана простая программа, которая показывает использование буферизированных потоков. Смотрите.

// Import
import java.io.*;


/** Copies a source file to the destination file. */
public class FileCopier {

/** The block size to read in one shot. */
public static final int BLOCK_SIZE = 1024;

/** Copies from source to destination.
* @param src : The source stream.
* @param dest: The destination.
* @exception IOException
*/
public void copy(InputStream src, OutputStream dest) throws IOException {

// Use buffered streams for better performance
BufferedInputStream in = null;
BufferedOutputStream out = null;

try {

// Initialize the streams
in = new BufferedInputStream(src);
out = new BufferedOutputStream(dest);

// The number of bytes read
int numRead = 0;

// The buffer to hold the read in data
byte[] buf = new byte[BLOCK_SIZE];

// Read from source and write to the destination
while((numRead = in.read(buf, 0, buf.length)) != -1) {

// Write to the destination
out.write(buf, 0, numRead);

}

}
finally {

// Close
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
catch(Exception ex) {}

}

}

/** Main. */
public static void main(String[] args) {

// The source and destination streams
FileInputStream in = null;
FileOutputStream out = null;

try {

// Check for the number of arguments
// Note that args[0] represents the first argument
if (args.length != 2) {
System.out.println(
"Usage: FileCopier ");
}
else {

// The source and the destination files
String src = args[0];
String dest = args[1];

// Initialize the streams
in = new FileInputStream(src);
out = new FileOutputStream(dest);

// Create an instance of the copier
FileCopier copier = new FileCopier();

// Copy now
copier.copy(in, out);

}

}
catch(Exception ex) {
System.out.println("FileCopier: " + ex.getMessage());
ex.printStackTrace();
}

}

}
Давайте начнем с main(). Приложение должно быть запущено с 2 параметрами - исходный файл и файл назначения. Мы сохраняем эти два параметра в 2 строковых переменных - src и dest. Затем, инициализируем входные и выходные потоки, которые представляют соответствующие файлы.
Метод copy() фактически делает копию, а классы BufferedInputStream и BufferedOutputStream используются для достижения большей эффективности. Также у нас есть переменная для сохранения информации о количестве байтов считанных из потока. Затем, мы выполняем распределение буфера для чтения данных. Размер буфера был установлен в BLOCK_SIZE. Далее выполняем итерации чтения из входного потока и записи в выходной поток. В блоке finally закрываем потоки.

Цель заключается в нахождении лучшего класса для обслуживания своих запросов.
Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Оноре де Бальзак:

"Тот, кто ищет миллионы, весьма редко их находит, но зато тот, кто не ищет, не находит их никогда."

Опрос

Как Вам новый дизайн сайта?

Отлично
Неплохо
Нормальный
Ужасно