Какие вы видите проблемы в данном коде?
От: Foror http://foror.ru
Дата: 16.05.07 05:32
Оценка:
void writeLines(File file, String[] lines, String encoding) throws IOException {
    OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
    try {
        for (String line: lines) {
            os.write(line.getBytes(encoding));
            os.write('\n');
        }
    } finally {
        os.close();
    }
}
Re: Какие вы видите проблемы в данном коде?
От: Blazkowicz Россия  
Дата: 16.05.07 05:45
Оценка: 3 (1) +2
Здравствуйте, Foror, Вы писали:

F> os.write('\n');


lineSeparator = java.lang.System.getProperty('line.separator');
Re[2]: Какие вы видите проблемы в данном коде?
От: aefimov Россия
Дата: 16.05.07 06:05
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>
B>lineSeparator = java.lang.System.getProperty('line.separator');
B>


Согласен, весьма распространненная ошибка.
Вот даже при конфигурации log4j надо указывать не \n, а $n, иначе переводы строк будут не те и лог смотреть будет не приятно
Re[3]: Какие вы видите проблемы в данном коде?
От: b_manvelyan Украина  
Дата: 16.05.07 06:28
Оценка:
Здравствуйте, aefimov, Вы писали:

A>Вот даже при конфигурации log4j надо указывать не \n, а $n, иначе переводы строк будут не те и лог смотреть будет не приятно


Ой, а можно чуть подробнее, гед надо указывать. Спасибо.
Re[4]: Какие вы видите проблемы в данном коде?
От: aefimov Россия
Дата: 16.05.07 06:31
Оценка: 1 (1)
Здравствуйте, b_manvelyan, Вы писали:

_>Ой, а можно чуть подробнее, гед надо указывать. Спасибо.


Я чуток напутал — не $n, а %n:

<?xml version='1.0' encoding='ISO-8859-1' ?>
<!DOCTYPE log4j:configuration SYSTEM "file:./log4j.dtd">

<log4j:configuration>
   <appender name="CONSOLE-WARN" class="org.apache.log4j.ConsoleAppender">
     <param name="target" value="System.err"/>
     <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="[%7r] %6p - %14.14c - %m%n"/>
     </layout>
     <filter class="org.apache.log4j.varia.LevelRangeFilter">
       <param name="LevelMin" value="DEBUG"/>
     </filter>
   </appender>

   <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
      <param name="MaxFileSize" value="1Mb"/>
      <param name="MaxBackupIndex" value="3"/>
      <param name="file" value="log/app.log"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d [%7r] %6p - %14.14c - %m%n"/>
      </layout>
   </appender>

   <root>
     <priority value="DEBUG"/>
     <appender-ref ref="FILE"/>
   </root>
</log4j:configuration>
Re[5]: Какие вы видите проблемы в данном коде?
От: b_manvelyan Украина  
Дата: 16.05.07 06:35
Оценка:
Здравствуйте, aefimov, Вы писали:

_>>Ой, а можно чуть подробнее, гед надо указывать. Спасибо.


A>Я чуток напутал — не $n, а %n:


Фух, а я ж испугался, что столько лет использую и не лучшим образом.
Re: Какие вы видите проблемы в данном коде?
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 16.05.07 06:38
Оценка: 1 (1)
Здравствуйте, Foror, Вы писали:

F>
F>void writeLines(File file, String[] lines, String encoding) throws IOException {
F>    OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
F>    try {
F>        for (String line: lines) {
F>            os.write(line.getBytes(encoding));
F>            os.write('\n');
F>        }
F>    } finally {
F>        os.close();
F>    }
F>}
F>




Итого:

    public void writeLines(File file, String encoding, String ... lines) throws IllegalStateException {
        try {
            writeLinesImpl(file, encoding, lines);
        } catch (IOException e) {
            throw new IllegalStateException("Unexpected exception occured during writing to file. File: "
                    + file.getAbsolutePath() + ", data to write: " + Arrays.toString(lines));
        }
    }

    private void writeLinesImpl(File file, String encoding, String ... lines) throws IOException {
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), encoding));
        try {
            for (String line : lines) {
                writer.write(line);
                writer.newLine();
            }
//            writer.flush(); // implicitly called at writer.close() invocation
        } finally {
            writer.close();
        }
    }


P.S. плюс, конечно, джавадок на методы.
http://denis-zhdanov.blogspot.com
Re[2]: Какие вы видите проблемы в данном коде?
От: Blazkowicz Россия  
Дата: 16.05.07 06:44
Оценка: 1 (1) +1
Здравствуйте, bolshik, Вы писали:

Исходный код мне импонировал больше своей лаконичностью. Хотя конечно же надо ещё смотреть на то где этот метод используется.

B> throw new IllegalStateException("Unexpected exception occured during writing to file. File: "

B> + file.getAbsolutePath() + ", data to write: " + Arrays.toString(lines));

Эй, а cause? Так по логам нельзя будет восстановить причину ошибки.
Re[3]: Какие вы видите проблемы в данном коде?
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 16.05.07 07:02
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Эй, а cause? Так по логам нельзя будет восстановить причину ошибки.


Да, про cause забыл
http://denis-zhdanov.blogspot.com
Re[2]: Какие вы видите проблемы в данном коде?
От: dshe  
Дата: 16.05.07 07:19
Оценка: 4 (2)
Здравствуйте, bolshik, Вы писали:


Что касается 1 и 3. согласен. А вот 2 -- спорный пункт. Совершенно не факт, что в данном случае с IOException'ом нужно обязательно что-то сделать. Вполне возможно, что данный writeLines -- это не единственный утилитный метод, а есть еще readLines и еще некоторое количество подобных методов, которые используются совместно в неком методе performSomeHighLevelWork, который, кстати, может сам может использовать низкоуровневое Java IO API. Поэтому, вместо того, чтобы в каждом из методов типа writeLines писать
        } catch (IOException e) {
            throw new IllegalStateException("Unexpected exception occured during blah-blah-blah", e);
        }

может оказаться проще написать это один раз в performSomeHighLevelWork. Ну и естественно, не забыть cause.
--
Дмитро
Re[3]: Какие вы видите проблемы в данном коде?
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 16.05.07 07:53
Оценка: +1
Здравствуйте, dshe, Вы писали:

D>Что касается 1 и 3. согласен. А вот 2 -- спорный пункт. Совершенно не факт, что в данном случае с IOException'ом нужно обязательно что-то сделать. Вполне возможно, что данный writeLines -- это не единственный утилитный метод, а есть еще readLines и еще некоторое количество подобных методов, которые используются совместно в неком методе performSomeHighLevelWork, который, кстати, может сам может использовать низкоуровневое Java IO API. Поэтому, вместо того, чтобы в каждом из методов типа writeLines писать

D>
D>        } catch (IOException e) {
D>            throw new IllegalStateException("Unexpected exception occured during blah-blah-blah", e);
D>        }
D>

D>может оказаться проще написать это один раз в performSomeHighLevelWork.

Это да, лень — одно из оснвных достоинств разрабочика. Понятно, что не бывает универсального решения, которое было бы лучшим во всех ситуациях. Мое предложение относится к 'standalone method'.


D>Ну и естественно, не забыть cause.


http://denis-zhdanov.blogspot.com
Re[2]: Какие вы видите проблемы в данном коде?
От: MAPCUAHUH  
Дата: 16.05.07 15:32
Оценка:
Здравствуйте, bolshik, Вы писали:

B>Здравствуйте, Foror, Вы писали:



B>

B>Итого:


B>
B>    public void writeLines(File file, String encoding, String ... lines) throws IllegalStateException {
B>        try {
B>            writeLinesImpl(file, encoding, lines);
B>        } catch (IOException e) {
B>            throw new IllegalStateException("Unexpected exception occured during writing to file. File: "
B>                    + file.getAbsolutePath() + ", data to write: " + Arrays.toString(lines));
B>        }
B>    }

B>    private void writeLinesImpl(File file, String encoding, String ... lines) throws IOException {
B>        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), encoding));
B>        try {
B>            for (String line : lines) {
B>                writer.write(line);
B>                writer.newLine();
B>            }
B>//            writer.flush(); // implicitly called at writer.close() invocation
B>        } finally {
B>            writer.close();
B>        }
B>    }
B>


Что-то не понял для чего так оборачивать метод writeLinesImpl и почему не кидать IOException наерх?
Re: Какие вы видите проблемы в данном коде?
От: Дмитрий В  
Дата: 16.05.07 15:49
Оценка:
А я б написал так:

public static void writeLines(File file, String[] lines) throws IOException {
        PrintStream fileWriter = new PrintStream(file);
        try {
            for (String line : lines) {
                fileWriter.println(line);
            }
        } finally {
            if(fileWriter!=null)
                fileWriter.close();
        }
    }
Re[2]: Какие вы видите проблемы в данном коде?
От: . Великобритания  
Дата: 16.05.07 16:02
Оценка: 1 (1)
Дмитрий В wrote:

> if(fileWriter!=null)

Вот это лишнее, имхо.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Какие вы видите проблемы в данном коде?
От: Дмитрий В  
Дата: 16.05.07 16:08
Оценка:
Здравствуйте, ., Вы писали:

.>Дмитрий В wrote:


>> if(fileWriter!=null)

.>Вот это лишнее, имхо.

Эт точно, надо было так написать


public static void writeLines(File file, String[] lines) throws IOException {
        PrintStream fileWriter = null;
        try {
           fileWriter = new PrintStream(file);
            for (String line : lines) {
                fileWriter.println(line);
            }
        } finally {
            if(fileWriter!=null)
                fileWriter.close();
        }
    }
Re[4]: Какие вы видите проблемы в данном коде?
От: . Великобритания  
Дата: 16.05.07 16:13
Оценка: +2
Дмитрий В wrote:

>> > if(fileWriter!=null)

> .>Вот это лишнее, имхо.
>
> Эт точно, надо было так написать
А чем так плохо?
     public static void writeLines(File file, String[] lines) throws IOException {
         PrintStream fileWriter = new PrintStream(file);
         try {
             for (String line : lines) {
                 fileWriter.println(line);
             }
         } finally {
             fileWriter.close();
         }
     }
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Какие вы видите проблемы в данном коде?
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 17.05.07 07:00
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>Что-то не понял для чего так оборачивать метод writeLinesImpl и почему не кидать IOException наерх?


Потому что IOException — checked exception.
http://denis-zhdanov.blogspot.com
Re[4]: Какие вы видите проблемы в данном коде?
От: Donz Россия http://donz-ru.livejournal.com
Дата: 17.05.07 09:28
Оценка: 12 (1)
Здравствуйте, bolshik, Вы писали:

MAP>>Что-то не понял для чего так оборачивать метод writeLinesImpl и почему не кидать IOException наерх?


B>Потому что IOException — checked exception.


А в чём проблема то? Там, наверху, в зависимости от того, что и куда пишем, сами разберутся, что с исключением делать.

По коду. Если возникло исключение во время работы методов write, то, возможно, будет исключение и при попытке закрыть поток, но так как закрытие находится в блоке finally, то исключение от попытки закрытия потока подавит "настоящее" исключение, то есть возможно потеряется истинная причина исключительной ситуации.
Re[5]: Какие вы видите проблемы в данном коде?
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 17.05.07 10:06
Оценка: +1
Здравствуйте, Donz, Вы писали:

D>А в чём проблема то? Там, наверху, в зависимости от того, что и куда пишем, сами разберутся, что с исключением делать.


В том, что неудобно. Там, наверху, должны сами решать, хотят они обрабатывать эксепшн или не хотят (мы со своей стороны четко прописываем IllegalStateException в сигнатуре, плюс пишем джавадок, т.е. даем всю необходимую информацию). В случае же с checked exception наверху должны всегда производить обработку.


D>По коду. Если возникло исключение во время работы методов write, то, возможно, будет исключение и при попытке закрыть поток, но так как закрытие находится в блоке finally, то исключение от попытки закрытия потока подавит "настоящее" исключение, то есть возможно потеряется истинная причина исключительной ситуации.


Да, теоретически возможно, но, имхо, в данном случае преимущество обработки такой ситуации меньше, чем увеличение объема и уменьшение читабельности кода, необходимого для этого.
http://denis-zhdanov.blogspot.com
Re[6]: Какие вы видите проблемы в данном коде?
От: aka50 Россия  
Дата: 17.05.07 10:10
Оценка:
Здравствуйте, bolshik, Вы писали:

B>Здравствуйте, Donz, Вы писали:


D>>А в чём проблема то? Там, наверху, в зависимости от того, что и куда пишем, сами разберутся, что с исключением делать.


B>В том, что неудобно. Там, наверху, должны сами решать, хотят они обрабатывать эксепшн или не хотят (мы со своей стороны четко прописываем IllegalStateException в сигнатуре, плюс пишем джавадок, т.е. даем всю необходимую информацию). В случае же с checked exception наверху должны всегда производить обработку.


А что мешает им кинуть выше? Ведь checked на то и checked чтобы обратить внимание на то, что метод не может принять решение что делать дальше. Т.е. сами по себе checked конечно не панацея, но отказываться от них полностью — суть зло.

Я обычно руководствуюсь простыми правилами:
1. Утилитный класс или внутренняя логика — checked
2. Компонентный (например dao) — unchecked либо один большой checked
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.