1. Codificação de documentos
pacote com.study.io;/*** codificação do arquivo de teste*/public classe codedemo {/*** @param args*@throws Exceção*/public static void main (string [] args) lança exceção {string s = "estuda o poço abc"; byte [] bytes1 = s.getBytes (); do projeto (aqui é UTF-8) para (byte b: bytes1) {// converte bytes (para int) para exibir System.out.print (Integer.toHexString (b & 0xff)+""); // & 0xff é remover os primeiros 24 0s e deixar os últimos oito dígitos} System.out.Int.Int.IntL ( byte em inglês */byte [] bytes2 = s.getBytes ("utf-8"); // haverá uma exceção exibida aqui, por isso lançaremos essa exceção para (byte b: bytes2) {System.out.print (integger.tohexstring (b & 0xff)+");} system.out.IntlnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnN (b & 0xff)+"); em inglês */byte [] bytes3 = s.getbytes ("gbk"); // haverá uma exceção exibida aqui, então lançaremos essa exceção para (byte b: bytes3) {System.out.print (integlags.toHexstring (B & 0XFF)+"1);} System.out.prIntlnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn () * 2 bytes*/byte [] bytes4 = s.getBytes ("utf-16be"); // haverá uma exceção exibida aqui, então lançaremos essa exceção para (byte b: bytes4) {System.out.print (integger.tohexstring (b & 0xff)+""); Deseja transformar a sequência de bytes em uma string, você também precisa usar esse método de codificação; caso contrário, o código iluminado aparecerá*/string str1 = new String (bytes4); // No momento, a codificação padrão do projeto será usada para converter, e o código de recodificação pode parecer system.out.println (str1); String (Bytes4, "UTF-16BE"); System.out.println (str2);}} analisar:
* 1. Explicação de "& 0xff":
* 0XFF representa hexadecimal (decimal é 255) e é expresso como binário, que é "1111111111".
* Então o & personagem representa o número de bits (retorne 1 quando o mesmo for 1, caso contrário, retorne 0)
* 2. Byte Byte e Int Type Conversão:
* INTEGER.TOHEXSTRING (B & 0XFF) Aqui, B e 0XFF do tipo de byte são realizados pela primeira vez e, em seguida, inteiro.tohexstring obtém a sequência hexadecimal
* Pode -se observar que o resultado do B & 0XFF ainda é um INT, então por que você precisa executar uma operação com 0xFF? Inteiro direto.tohexstring (b);, não pode forçar o byte a ser convertido? A resposta não é possível.
* O motivo é: 1. O tamanho do byte é de 8 bits e o tamanho do INT é de 32 bits; 2. Java's Two's Complement Form
* O parâmetro de Integer.ToHexString é int. Se & 0xff não for realizado, quando um byte será convertido em int, pois o INT é de 32 bits e o byte tiver apenas 8 bits, ele será preenchido neste momento. . . . . .
* Portanto, quando um byte e 0xFF estão envolvidos, o byte será convertido em uma cirurgia plástica primeiro, para que os 24 bits altos no resultado sejam sempre limpos em 0, portanto o resultado é sempre o que queremos.
* 3.Utf-8 Codificação: Chineses ocupa 3 bytes e inglês ocupa 1 byte
* codificação de GBK: chinês ocupa 2 bytes e inglês ocupa 1 byte
* O Java usa a codificação de dois bytes (ou seja, um caractere em Java é responsável por dois bytes) e é a codificação UTF-16BE. Chinês ocupa 2 bytes, o inglês ocupa 2 bytes
*
* 4. Quando sua sequência de bytes é uma certa codificação, se você deseja transformar a sequência de bytes em uma string, também precisará usar esse método de codificação, caso contrário, ocorrerá o código iluminado.
* 5. Os arquivos de texto são sequências de bytes. Pode ser qualquer sequência codificada de bytes.
* Se criarmos um arquivo de texto diretamente em uma máquina chinesa, o arquivo reconhece apenas a codificação do ANSI (por exemplo, crie um arquivo de texto diretamente no computador)
2. Uso da classe de arquivo
pacote com.study.io; importar java.io.file;/*** Uso da classe de arquivo*/public class filedemo {/*java.io.file classe representa um arquivo ou diretório. A classe de arquivo é usada apenas para representar as informações de um arquivo ou diretório (nome, tamanho, etc.) e não pode ser usado para acessar o conteúdo do arquivo. */public static void main (string [] args) {arquivo file = new File ("d: // 111"); // Ao criar um objeto de arquivo, você precisa usar barras duplas para especificar o diretório, porque "/" é um caractere de fuga/*o separador no meio do diretório pode ser usado com as telhas duplas ,/SHOPSHERS, ou FILEPAR. File ("d:"+file.separator); // system.out.println (file.exists ()); // exist () determina se existe um arquivo ou pasta if (! File.exists ()) {// se o arquivo não existe (mkdir.mkdir (); // criar uma pasta mkdir () e mkdirs () () e criar uma pasta MKDIR () e mkdirs (); diretório} else {file.delete (); // excluir um arquivo ou pasta} // Detecte se é um diretório ISDirectory, retorne TRUE se for um diretório, retorne Falsesystem.out.println (file.isdirectory (); // exibe se é um arquivo isfilesystem.out.utilnnnnnnnn (file); Arquivo file2 = new file ("d: // 222", "123.txt"); // API comum: system.out.println (file); // imprima o conteúdo de file.toString () system.out.println (file.getabsolutepath (); // obtenha o caminho absoluto.out.println (FILE.PRIPTLN (FILE.GETBSOLUTEPATH (); System.out.println (file2.getName ()); System.out.println (file.getParent ()); // Obtenha o pai absoluto do pai System.out.println (file2.getParentFile (). Getabsolutepath ());}} Resultados em execução:
ilustrar:
Java.io.file Class representa um arquivo ou diretório
A classe de arquivo é usada apenas para representar informações (nome, tamanho, etc.) de um arquivo ou diretório e não pode ser usado para acessar o conteúdo do arquivo.
APIs comumente usadas:
1. Crie um objeto de arquivo: arquivo de arquivo = novo arquivo (caminho da string); Nota: file.seperater (); Obtenha o delimitador do sistema, como: "/".
2. seja boolean file.exists (); existe.
3.File.mkdir (); ou file.mkdirs (); Crie um diretório ou diretório de vários níveis.
4.File.isDirectory () determina se é um diretório
file.isfile () determina se é um arquivo.
5.File.Delete (); Excluir arquivo ou diretório.
6.File.CreateNewFile (); Crie um novo arquivo.
7.File.getName () Obtém o nome do arquivo ou o caminho absoluto do diretório.
8.File.getabsolutepath () Obtém o caminho absoluto.
9.File.getParent (); Obtenha o caminho absoluto dos pais.
1. Atravesse o diretório
pacote com.study.io; importar java.io.file; importar java.io.ioException;/*** Ferramenta de arquivos*lista as operações comuns da classe de arquivo, como: filtragem, travessia, etc. ListDirectory (Arquivo dir) lança IoException {if (! DIR.Exists ()) {// exist () O método é usado para determinar se um arquivo ou diretório lançará o novo IllegalarGumGumentException ("Dir:"+Dir+"não existe");} se (! IllegalArgumentException(dir+"not a directory");}/*String[] fileNames = dir.list();//list() method is used to list the subdirectories and files in the current directory (it is directly the name of the subdirectories and does not contain the contents in the subdirectories), and the string array is returned for (String string: fileNames) {System.out.println (string);}*/// Se você deseja atravessar o conteúdo no subdiretório, precisará construir o objeto de arquivo para operações recursivas. O arquivo fornece um apifile que retorna diretamente o objeto de arquivo. listfiles = dir.listfiles (); // retorna uma abstração do subdirectory direto (arquivo) if (listfiles! = null && listfiles.length> 0) {for (arquivo de arquivo: listfiles) {/*system.out.println(file); listDirectory (file);} else {System.out.println (file);}}}}}} Classe de teste:
classe pública FileUtilstest {public static void main (string [] args) lança ioexception {fileUtils.ListDirectory (new File ("d: // iostudy"));}}} Resultados em execução:
3. Uso da classe RandomAccessFile
RandomAccessFile: Java fornece acesso ao conteúdo do arquivo, que pode ser usado para ler arquivos ou gravar arquivos.
RandomAccessFile suporta acesso aleatório aos arquivos e pode acessar qualquer local do arquivo.
Observe o modelo de arquivo java:
Resultados em execução:
1
12
[65, 66, 127, -1, -1, -1, 127, -1, -1, -1, -42, -48]
7f
ff
ff
ff
7f
ff
ff
ff
d6
d0
4.
Os fluxos de IO podem ser divididos em fluxos de entrada e fluxos de saída.
Aqui ele pode ser dividido em fluxo de bytes e fluxo de caracteres.
Exemplo de código:
pacote com.study.io; importar java.io.bufferedInputStream; importar java.io.bufferedoutputStream; importar java.io.file; importar java.io.fileInputStream; import java.io.fileoutputputpy; reading data on files* FileOutputStream-->Implementation of the method of writing byte data into files* ❤Data input and output stream: * DataOutputStream / DataInputStream: Extending the "stream" function, you can read int, long, characters and other types of data more int, long, and other types* DataOutputStream writeInt()/writeDouble()/writeUTF()* ❤Byte buffered stream: * BufferedInputStream & BufferoudOutputStream* Esses dois bits de classe de fluxo fornecem operações com buffers. Geralmente, ao abrir um arquivo para escrever ou ler operações, o buffer será adicionado. This stream mode improves the performance of IO* For example: Putting input into a file from an application is equivalent to pouring a cylinder of water into another cylinder: FileOutputStream--->write() method is equivalent to "transferring" the water over DataOutputStream-->writeXxx() method is more convenient, equivalent to "transferring" the water over BufferedOutputStream--->write method is more convenient, equivalent to Colocando uma colher no balde primeiro (ou seja, a área tampão) e depois derramando -o em outro cilindro do balde. O desempenho é aprimorado*/public Classe ioutil {/*** Leia o conteúdo do arquivo especificado e produz-o para o console em hexadecimal* e a cada 10 bytes quebra de linha* @param nome de arquivo* single-byte leitor não é adequado para arquivos grandes e arquivos grandes são muito ineficientes/public estática olenthex (string filename) in = new FileInputStream (nome do arquivo); int b; int i = 1; while ((b = in.read ())! =-1) {/* 0xFF é substituído por sistema de 2 dígitos, o que significa 8 1s. Dessa maneira, os 8 bits inferiores do personagem são realmente tomados. * Oxf é 15. Os números inferiores a 15 serão convertidos em um número hexadecimal. * Seu código espera ser dois números hexadecimais fixos; portanto, quando apenas um é gerado, você precisa adicionar 0*/if (b <= 0xf) {// Integer.toHexString (b) antes que o número da unidade seja suplementado com 0System.out.print ("0");} // Integer.oHexstring Antestring (B) B) System.out.print (Integer.toHexString (B)+""); if (i ++%10 == 0) {System.out.println ();}} in.close (); // A leitura de arquivos deve ser fechada após a leitura e a escrita}/*** LEITURA LOTA é eficiente para arquivos grandes e também é a maneira mais usada para ler os arquivos* @param filename* @THOWS ioxException*/public static prosstre Ioexception {fileInputStream in = new FileInputStream (nome do arquivo); byte [] buf = new Byte [8* 1024];/* lote leia bytes de in e colocá -los na matriz de bytes de BUF,* inicia a posição da 0ª posição e coloque na maioria dos BUF. in.read (buf, 0, buf.length); // Leia ao mesmo tempo, indicando que a matriz de bytes é grande o suficiente int j = 1; para (int i = 0; i <bytes; i ++) {System.out.print (Integer.toHexString (buf [i] & 0xff)+""); if (j ++%10 == 0) {System.out.println ();}*/int bytes = 0; in.read (buf, 0, buf.Length))! =-1) {for (int i = 0; i <bytes; i ++) {System.out.print (Integer.tohexstring (BUF [i] e 0xff)+"");/*** & 0xff: Byte Type 8 bits, tipo 32 bits) & 0xff*/if (j ++%10 == 0) {System.out.println ();}}} in.close ();}/*** cópia do arquivo, byte lotes leia* @param srcfile* @param destfile* @throws iOexception*/público estático vaid cópia (! srcfile.exists ()) {lança nova ilegalArgumentException ("arquivo:" + srcfile + "não existe");} if (! srcfile.isfile ()) {throw igleGalarGumentException (srcfile + "não é um arquivo s);} fileInTream em = FileInTream; FileOutputStream (Destfile); // Quando o arquivo não existir, ele será criado diretamente; Se existir, exclua -o e crie byte [] buf = novo byte [8 * 1024]; // LEIA e escreva em lote int b; while ((b = in.read (buf, 0, buf.length))! = -1) {//read(Buf,0,buf.length) A leitura com parâmetros retorna o comprimento total dos bytes; Quando todos são lidos é -1; out.write (buf, 0, b); out.flush (); // é melhor adicionar} in.close (); out.close ();}/*** copiar o arquivo e usar o fluxo de bytes em buffer* @param srcfile* @param destfile* @throws ioexception*/public static void copybuffer (file srcfile, file o file destfil) Ioexception {if (! Srcfile.exists ()) {tiro novo ilegalargumentException ("arquivo:"+srcfile+"não existe");} if (! Srcfile.isfile ()) {throw ilegalargumentException (srcfile+"não um arquivo"); FileInputStream (srcfile)); bufferedoutputStream bos = new bufferoudOutputStream (new FileOutputStream (destfile)); int c; while ((c = bis.read ())! buffering for file copy* @param srcFile* @param destFile* @throws IOException*/public static void copyFileByByte(File srcFile,File destFile)throws IOException{if(!srcFile.exists()){throw new IllegalArgumentException("File:"+srcFile+"Not existir ");} if (! srcfile.isfile ()) {tiro novo ilegalargumentException (srcfile+" não um arquivo ");} fileInputStream em = new FileInputStream (srcfile); fileOutputStream out = new FileOutputStream (destfile); Retorna o conteúdo de leitura de bytes; Quando todas as leituras são devolvidas é -1; out.write (c); out.flush ();} in.close (); out.close (); out.close ();}} Classe de teste:
pacote com.study.io; importar java.io.file; importar java.io.ioException; importar org.junit.test; public class ioutiltest {@testpublic void testprInthex () {try {ioutil.prInthex ("d: //javaio//fileutils.java" {E.PrintStackTrace ();}}@testpublic void testPriThexByByTearray () {try {long start = System.currenttimemillis (); // a diferença horária entre o tempo atual e a meia -noite em 1 de janeiro de 1970 (medido em milissegundos) //Ioutil.printhexbyByTearray("e://javaio//fileutils.java") ;//ioutil.printhex("e://javaio/1.mp3"); System.currenttimemillis (); system.out.println (end - start);} catch (ioexception e) {e.printStackTrace ();}}@testpublic void testCopyFile () {try {ioutil.copyFile (novo arquivo ("d: //javaio/1/1/1/1/11.copyfile" File ("d: //javaio//1copy.txt"));} catch (ioexception e) {e.printStackTrace ();}}@testpublic void testCopyFileByBuffer () {Try {Long start = System.Curntimemillis ();/*ioutil.copy File("e://javaio//1.mp3"), new File("e://javaio//2.mp3"));*/ //More than 20,000 milliseconds/*IOUtil.copyFileByBuffer(new File("e://javaio//1.mp3"), new File("e://javaio//3.mp3"));//More than 10,000 MillisEconds*/ioutil.copyfile (novo arquivo ("e: //javaio//1.mp3"), novo arquivo ("e: //javaio//4.mp3"); // 7ms end = system.currenttimemillis (); system.out.println (end - start); }} 5. Stream de caracteres
pacote com.study.io; importar java.io.fileInputStream; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.inputStreamReader; import java.io.outputStreamWriter; public class IsrandoswDemo {public staid Maid Main Main (strings (stringn string; FileInputStream ("e: //javaio//utf8.txt"); inputStreamReader isr = new InputStreamReader (in, "utf-8"); // codificação de projeto padrão. Ao operar, você precisa escrever o formato de codificação do próprio arquivo. FileOutputStream out = new FileOutputStream ("e: //javaio//utf81.txt"); outputStreamWriter Osw = new OutputStreamWriter (out, "utf-8");/*int c; while ((c = isr.read ()! C;/*LEIA LOTA, Coloque a matriz de caracteres buffer, comece a partir da posição 0 e coloque o buffer.length no máximo. O número de caracteres retornados é o número de caracteres de leitura*/while ((c = isr.read (buffer, 0, buffer.length))! =-1) {string s = novo String (buffer, 0, c); System.out.print (s); Osw.write (buffer, 0, c); osw.flush ();} isr.close (); osw.close (); osw.close ();}}Arquivo Leia e gravação Stream de Stream de caracteres (FileReader/FileWriter)
Filtro para fluxos de caracteres
6. serialização e deserialização de objetos
Exemplo:
Perceber: