Да, вы можете сделать это в одну строку (хотя для надежной обработки IOException
вы бы этого не хотели).
String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);
Здесь используется java.util.Scanner
, который указывает ему разграничить входные данные с \Z
, что является концом якоря строки. Это в конечном итоге делает входные данные одним фактическим токеном, который представляет собой весь файл, поэтому его можно прочитать одним вызовом next()
.
Существует конструктор, который принимает File
и String charSetName
(среди многих других перегрузок). Эти два конструктора могут бросать FileNotFoundException
, но, как и все Scanner
методы, никакие IOException
не могут быть брошены вне этих конструкторов.
Вы можете запросить сам Scanner
через ioException()
метод, произошло ли IOException
или нет. Вы также можете захотеть явно закрыть()
сканер Scanner
после чтения содержимого, поэтому, возможно, лучше всего хранить ссылку на Scanner
в локальной переменной.
Для полноты картины, вот некоторые действительно хорошие варианты, если у вас есть эти очень авторитетные и очень полезные сторонние библиотеки:
com.google.common.io.Files
содержит много полезных методов. Здесь уместны следующие:
String toString(File, Charset)
String
List readLines(File, Charset)
List
, по одной записи на строкуorg.apache.commons.io. IOUtils
также предлагают подобную функциональность:
String toString(InputStream, String encoding)
InputStream
в виде String
List readLines(InputStream, String encoding)
List
из String
, по одной записи на строкуВы можете использовать Apache Commons IO ..
FileInputStream fisTargetFile = new FileInputStream(new File("test.txt"));
String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8");
Не пишите свой собственный класс util для этого - я бы рекомендовал использовать Guava, который полон всякого добра. В этом случае вам нужен либо класс Files
(если вы действительно просто читаете файл), либо CharStreams для более общего чтения. В нем есть методы для чтения данных в список строк (readLines
) или полностью (toString
).
В нем есть аналогичные полезные методы и для двоичных данных. А затем есть остальная часть библиотеки...
Я согласен, что раздражает, что в стандартных библиотеках нет ничего подобного. Черт возьми, просто возможность передать CharSet
в FileReader
сделала бы жизнь немного проще...
Другой альтернативный подход:
Как мне создать строку Java из содержимого файла?
Другой вариант - использовать служебные программы, предоставляемые библиотеками с открытым исходным кодом
http: //commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html
Почему java не предоставляет такой общий API-интерфейс использования?
a) , чтобы API оставались общими, чтобы кодирование, буферизация и т. Д. Выполнялись программистом.
б) заставить программистов выполнять некоторую работу и писать / совместно использовать библиотеки утилит с открытым исходным кодом: D; -)
К сожалению, нет.
Я согласен, что такая частая операция должна иметь более простую реализацию, чем копирование ввода построчно в цикле, но вам придется либо написать вспомогательный метод, либо использовать внешнюю библиотеку.