Files.probeContentType(Path path)方法探測(cè)文件的內(nèi)容類(lèi)型。
該方法以多用途Internet郵件擴(kuò)展(MIME)內(nèi)容類(lèi)型的值的字符串形式返回內(nèi)容類(lèi)型。
如果一個(gè)文件的內(nèi)容類(lèi)型不能確定,則返回null。
以下代碼顯示如何探測(cè)文件的內(nèi)容類(lèi)型。
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.io.IOException; public class Main { public static void main(String[] args) { Path p = Paths.get("C:\\Java_Dev\\test1.txt"); try { String contentType = Files.probeContentType(p); System.out.format("Content type of %s is %s%n", p, contentType); } catch (IOException e) { e.printStackTrace(); } } }
上面的代碼生成以下結(jié)果。
Files類(lèi)包含以下方法來(lái)讀取文件的內(nèi)容作為字節(jié)和文本行:
Files類(lèi)可以從Path對(duì)象獲取InputStream和BufferedReader對(duì)象。
newInputStream(Path path,OpenOption ... options)方法返回指定路徑的InputStream對(duì)象。它假定文件的內(nèi)容是UTF-8字符集。
newBufferedReader(Path path)和newBufferedReader(Path path,Charset cs)方法返回一個(gè)BufferedReader。我們可以指定字符集。
Files類(lèi)提供了使用其newByteChannel(Path path,OpenOption ... options)方法從Path對(duì)象中獲取SeekableByteChannel對(duì)象的方法。
OpenOption類(lèi)型配置正在打開(kāi)的文件。下表列出了OpenOption類(lèi)型的值及其描述。OpenOption是java.nio.file包中的一個(gè)接口。
java.nio.file包中的StandardOpenOption枚舉實(shí)現(xiàn)了OpenOption接口。
標(biāo)準(zhǔn)打開(kāi)選項(xiàng) | 描述 |
---|---|
APPEND | 將寫(xiě)入的數(shù)據(jù)附加到現(xiàn)有文件,如果文件被打開(kāi)寫(xiě)入。 |
CREATE | 創(chuàng)建一個(gè)新文件,如果它不存在。 |
CREATE_NEW | 創(chuàng)建一個(gè)新文件,如果它不存在。如果文件已存在,則操作失敗。 |
DELETE_ON_CLOSE | 關(guān)閉流時(shí)刪除文件。 在與臨時(shí)文件一起使用時(shí)非常有用。 |
DSYNC | 保持文件的內(nèi)容與底層存儲(chǔ)同步。 |
READ | 打開(kāi)具有讀訪問(wèn)權(quán)限的文件。 |
SPARSE | 如果它與CREATE_NEW選項(xiàng)一起使用,它對(duì)文件系統(tǒng)提示新文件應(yīng)該是稀疏文件。 |
SYNC | 保持文件的內(nèi)容和元數(shù)據(jù)與底層存儲(chǔ)同步。 |
TRUNCATE_EXISTING | 如果打開(kāi)文件以進(jìn)行寫(xiě)訪問(wèn),則將現(xiàn)有文件的長(zhǎng)度截?cái)酁榱恪?/td> |
WRITE | 打開(kāi)文件以進(jìn)行寫(xiě)訪問(wèn)。 |
以下代碼在默認(rèn)目錄中為test2.txt文件獲取一個(gè)SeekableByteChannel對(duì)象。
它打開(kāi)文件以進(jìn)行讀取和寫(xiě)入訪問(wèn)。它使用CREATE選項(xiàng),因此如果文件不存在,則創(chuàng)建該文件。
import static java.nio.file.StandardOpenOption.CREATE; import static java.nio.file.StandardOpenOption.READ; import static java.nio.file.StandardOpenOption.WRITE; import java.nio.channels.SeekableByteChannel; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) throws Exception { Path src = Paths.get("test2.txt"); SeekableByteChannel sbc = Files.newByteChannel(src, READ, WRITE, CREATE); } }
以下代碼演示了如何讀取和顯示我們默認(rèn)目錄中test1.txt文件的內(nèi)容。 如果文件不存在,程序?qū)@示一條錯(cuò)誤消息。
import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; public class Main { public static void main(String[] args) throws Exception{ Charset cs = Charset.forName("US-ASCII"); Path source = Paths.get("test1.txt"); List<String> lines = Files.readAllLines(source, cs); for (String line : lines) { System.out.println(line); } } }
我們可以使用Files類(lèi)的以下write()方法將內(nèi)容寫(xiě)入文件。
static Path write(Path path, byte[] bytes, OpenOption... options) static Path write(Path path, Iterable lines, OpenOption... options) static Path write(Path path, Iterable lines, Charset cs, OpenOption... options)
write()方法打開(kāi)文件,將傳遞的內(nèi)容寫(xiě)入文件,并關(guān)閉它。
如果沒(méi)有打開(kāi)選項(xiàng),它將使用CREATE,TRUNCATE_EXISTING和WRITE選項(xiàng)打開(kāi)文件。
如果我們正在向文件寫(xiě)入文本,它會(huì)寫(xiě)一個(gè)平臺(tái)相關(guān)的行分隔符。
如果在寫(xiě)入文本行時(shí)未指定charset,則假定使用UTF-8字符集。
以下代碼演示如何使用write()方法將文本行寫(xiě)入文件。
import static java.nio.file.StandardOpenOption.CREATE; import static java.nio.file.StandardOpenOption.WRITE; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> texts = new ArrayList<>(); texts.add("test"); texts.add("test"); Path dest = Paths.get("twinkle.txt"); Charset cs = Charset.forName("US-ASCII"); try { Path p = Files.write(dest, texts, cs, WRITE, CREATE); System.out.println("Text was written to " + p.toAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } } }
Files.newOutputStream(Path path,OpenOption ... options)返回指定路徑的OutputStream。
Files.newBufferedWriter(Path path,Charset cs,OpenOption ...選項(xiàng))方法為指定的路徑返回BufferedWriter。
上面的代碼生成以下結(jié)果。
SeekableByteChannel對(duì)象提供對(duì)文件的隨機(jī)訪問(wèn)。
我們可以使用Files類(lèi)的newByteChannel()方法為Path獲取一個(gè)SeekableByteChannel對(duì)象,如下所示:
Path src = Paths.get("test.txt"); SeekableByteChannel seekableChannel = Files.newByteChannel(src, READ, WRITE, CREATE, TRUNCATE_EXISTING);
我們可以使用size()方法以字節(jié)為單位獲取SeekableByteChannel實(shí)體的大小。
由于數(shù)據(jù)被截?cái)嗷驅(qū)懭胪ǖ?,因此更新了大小?/p>
import static java.nio.file.StandardOpenOption.CREATE; import static java.nio.file.StandardOpenOption.READ; import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; import static java.nio.file.StandardOpenOption.WRITE; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.SeekableByteChannel; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { Path src = Paths.get("test.txt"); String encoding = System.getProperty("file.encoding"); Charset cs = Charset.forName(encoding); try (SeekableByteChannel seekableChannel = Files.newByteChannel(src, READ, WRITE, CREATE, TRUNCATE_EXISTING)) { printDetails(seekableChannel, "Before writing data"); writeData(seekableChannel, cs); printDetails(seekableChannel, "After writing data"); seekableChannel.position(0); printDetails(seekableChannel, "After resetting position to 0"); readData(seekableChannel, cs); printDetails(seekableChannel, "After reading data"); } catch (IOException e) { e.printStackTrace(); } } public static void writeData(SeekableByteChannel seekableChannel, Charset cs) throws IOException { String separator = System.getProperty("line.separator"); StringBuilder sb = new StringBuilder(); sb.append("test"); sb.append(separator); sb.append("test2"); sb.append(separator); CharBuffer charBuffer = CharBuffer.wrap(sb); ByteBuffer byteBuffer = cs.encode(charBuffer); seekableChannel.write(byteBuffer); } public static void readData(SeekableByteChannel seekableChannel, Charset cs) throws IOException { ByteBuffer byteBuffer = ByteBuffer.allocate(128); String encoding = System.getProperty("file.encoding"); while (seekableChannel.read(byteBuffer) > 0) { byteBuffer.rewind(); CharBuffer charBuffer = cs.decode(byteBuffer); System.out.print(charBuffer); byteBuffer.flip(); } } public static void printDetails(SeekableByteChannel seekableChannel, String msg) { try { System.out.println(msg + ": Size = " + seekableChannel.size() + ", Position = " + seekableChannel.position()); } catch (IOException e) { e.printStackTrace(); } } }
上面的代碼生成以下結(jié)果。
更多建議: