Ограничение создания размера файла с помощью java

Я пытаюсь ограничить создание размера одного файла в моем приложении Java. Для этого я сделал этот пример кода, в котором я объявляю одну переменную длиной 32 байта, запускаю метод WriteOnFile, зацикливая его до 32 байтов. Проблема в том, что не имеет значения, какое значение я установил для FILE_SIZE (больше или меньше), загружаемый файл всегда имеет размер 400 КБ - это означает, что мой код работает, поскольку исходный файл имеет размер 200 МБ, но имеет некоторую логическую ошибку. есть ли другой способ сделать это? потому что я основывался на этом сообщении Как ограничить размер файла в Java и пока ничего лучше не нашел

Мне было интересно, имеет ли это что-то с буферизованным писателем...

Заранее спасибо за помощь

public static final byte FILE_SIZE = 32;   

 private static void WriteOnFile(BufferedWriter writer, String crawlingNode){

               try {
                   while(file.length()<FILE_SIZE){

                    writer.write(crawlingNode);
                    System.out.println(file.length());
                   }
            } catch (IOException e) {

                JOptionPane.showMessageDialog(null, "Failed to write URL Node");
                    e.printStackTrace();            
            }

           }

person Victor R. Oliveira    schedule 19.07.2013    source источник
comment
Пост, на который вы ссылаетесь, действительно хорош, в котором первая точка 1. Определение длины байта, n, первой строки. очень важно...   -  person AurA    schedule 19.07.2013
comment
@nvrmnd относительно этого сообщения ourownjava.com/javafilewritervsbufferedwriter говорит, что у bufferedwriter есть 8192 (или около того) для записи , в файле (даже с ошибкой) 400 000, так что же делать с этим сокращением? Мне жаль, что я не мог получить это   -  person Victor R. Oliveira    schedule 19.07.2013
comment
@AurA Я не разбиваю строки в файле, так что не будет ошибкой проверить его?   -  person Victor R. Oliveira    schedule 19.07.2013
comment
Бьюсь об заклад, file.length() обновляется не так часто. Вы можете использовать OutputStream, который подсчитывает записанные байты и останавливается, когда он достигает предела.   -  person Kayaman    schedule 19.07.2013
comment
@Kayaman Я думал так же, потому что я устанавливаю FILE_SIZE на 50 МБ, чтобы увидеть, что должно получиться, и результат был таким же - например, если значение FILE_SIZE было слишком низким для 32, а первый блок записи был 400 КБ Я должен получить больше информации о файле, не так ли?   -  person Victor R. Oliveira    schedule 19.07.2013
comment
Ну, вам придется показать больше кода, чтобы иметь какой-то смысл. В любом случае такой подход не кажется очень хорошим.   -  person Kayaman    schedule 19.07.2013


Ответы (3)


Я просто немного попробовал, и я мог писать файлы размером 32 байта, напрямую ограничивая метод записи BufferedWriter:

        writer.write(crawlingNode, 0, 32);

При этом вызове в файл записываются только первые 32 символа. Поскольку моя кодировка была UTF-8, а это означает, что каждый символ занимает один байт, размер моего выходного файла составлял всего 32 байта. Запись только 16 символов привела к файлу размером 16 байт и так далее.

Так что, возможно, вы могли бы использовать это, не внедряя какие-то другие важные вещи.

ИЗМЕНИТЬ:

Если в вашей строке меньше 32 символов, используйте следующий вызов:

writer.write(crawlingNode, 0, crawlingNode.length);
person snrlx    schedule 19.07.2013
comment
Рад, что это помогло. Вам нужно только убедиться, что длина строки достаточна для заполнения 32 символов, иначе вы получите исключение StringIndexOutOfBoundsException. - person snrlx; 19.07.2013
comment
Какие-то проблемы с кодом или почему вы убрали отметку о принятом ответе? Дайте мне знать, чтобы я мог редактировать свой пост :) - person snrlx; 19.07.2013
comment
Я пытался отредактировать сообщение и объяснить, что это действительное решение простым способом, каким-то образом это работает с битовым массивом, он берет массив с нулевой позиции до 32, что вызывает отсутствие информации =\ не будет правильным решением за вопрос и испортит голову другому программисту, который увидит в этом принятый ответ - person Victor R. Oliveira; 19.07.2013
comment
Думаю, я немного смущен тем, что вы подразумеваете под потерей информации. Вы хотите записать первые 32 байта строки в файл. И String - это массив символов. Вот почему метод записывает в файл все символы с позиции 0 до 31. В результате получается файл размером 32 x 1 байт (в зависимости от кодировки). Там действительно теряется информация? - person snrlx; 19.07.2013

Используйте поток для ограничения размера файла, не полагайтесь на file.length().

Apache Commons имеет этот http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/output/CountingOutputStream.html

Но вы можете легко написать и свой собственный.

person Kayaman    schedule 19.07.2013

Я нашел свой собственный ответ. Да, это должно быть с буферизованным писателем. Буферизованный модуль записи имеет буфер по умолчанию размером 8 КБ для ЧТЕНИЯ. Для записи этот буфер сбрасывается каждые 400 КБ в моем случае приложения. Чтобы записать файл на один меньший размер, нам нужно использовать другой способ записи, например OutputSteam..

person Victor R. Oliveira    schedule 19.07.2013