Arquivo
O arquivo é uma representação abstrata de "arquivo" e "nome do diretório".
O arquivo é herdado diretamente do objeto, implementando a interface serializável e a interface comparável. A implementação da interface serializável significa que os objetos de arquivo suportam operações de serialização. Implementar a interface comparável significa que os objetos de arquivo podem ser dimensionados; Os arquivos podem ser armazenados diretamente em conjuntos ordenados (como TreeSet e Treemap).
1. Métodos comuns para criar novos diretórios
Método 1: Crie um novo diretório com base no caminho relativo.
O código de amostra é o seguinte (crie o novo diretório "dir" no caminho atual):
Arquivo dir = novo arquivo ("dir"); dir.mkdir (); Método 2: Crie um novo diretório com base no caminho absoluto.
O código de amostra é o seguinte (crie o novo diretório "/home/skywang/dir"):
Arquivo dir = novo arquivo ("/home/skywang/dir"); dir.mkdirs (); Nota: O acima é o código -fonte do novo diretório "/home/skywang/dir" no sistema Linux. Sob Windows, se você deseja criar um novo diretório "d:/dir", o código -fonte é o seguinte:
Arquivo dir = novo arquivo ("d:/dir"); dir.mkdir (); Método 3
Uri Uri = novo URI ("arquivo:/home/skywang/dir"); Arquivo dir = novo arquivo (URI); sub.mkdir (); Nota: Semelhante ao "Método 2", exceto que o caminho completo é passado no "Método 2", enquanto o caminho completo é passado no "Método 3" é o URI correspondente ao caminho completo.
2. Vários métodos comuns para criar um novo subdiretório. Por exemplo, queremos criar um novo subdiretório sob o subdiretório "dir" do diretório atual. Existem várias maneiras:
Método 1
Arquivo sub1 = novo arquivo ("dir", "sub1"); sub1.mkdir (); Nota: A função do método acima é "dir/sub1" no diretório atual. A premissa para funcionar normalmente é que o diretório pai "dir" de "sub1" já existe!
Método 2
Arquivo sub2 = novo arquivo (dir, "sub2"); sub2.mkdir ();
Nota: A função do método acima é "dir/sub2" no diretório atual. A premissa para funcionar normalmente é que o diretório pai "dir" de "sub2" já existe!
Método 3
Arquivo sub3 = novo arquivo ("dir/sub3"); sub3.mkdirs (); Nota: A função do método acima é "DIR/SUB3" no diretório atual. Não requer Dir para existir e pode ser executado normalmente; Se o caminho pai de "sub3" não existir, o método mkdirs () criará automaticamente o diretório pai.
Método 4
Arquivo sub4 = novo arquivo ("/home/skywang/dir/sub4"); sub4.mkdirs (); Nota: A função do método acima é criar um novo diretório "/home/skywang/dir/sub3". Não requer Dir para existir, e pode ser executado normalmente; Se o caminho pai de "sub4" não existir, o método mkdirs () criará automaticamente o diretório pai.
Método 5
URI URI = novo URI ("arquivo:/home/skywang/dir/sub5"); Arquivo sub5 = novo arquivo (URI); sub5.mkdirs (); Nota: Semelhante ao "Método 4", exceto que o caminho completo é passado no "Método 4", enquanto o caminho completo é passado no "Método 5" e o URI correspondente ao caminho completo é passado.
3. Vários métodos comuns para criar novos arquivos
Por exemplo, queremos criar um novo arquivo sob o subdiretório do diretório atual "dir". Existem vários métodos 1
tente {file dir = novo arquivo ("dir"); // Obtenha o objeto Arquivo correspondente ao diretório "Dir" Arquivo1 = novo arquivo (dir, "file1.txt"); file1.createNewfile ();} catch (ioexception e) {e.printStackTrace ();} Nota: A função do código acima é criar um novo arquivo "file1.txt" no diretório "dir" "Dir" (caminho relativo).
Método 2
tente {file file2 = novo arquivo ("dir", "file2.txt"); file2.CreateNewFile ();} Catch (ioexception e) {e.printStackTrace ();} Nota: A função do código acima é criar um novo arquivo "file2.txt" no diretório "dir" "Dir" (caminho relativo).
Método 3
tente {file file3 = novo arquivo ("/home/skywang/dir/file3.txt"); file3.CreateNewFile ();} Catch (IoException e) {E.PrintStackTrace ();} Nota: A função do código acima é criar um novo arquivo "/home/skywang/dir/file3.txt" (caminho absoluto). Este é um método baseado no caminho absoluto no Linux. No Windows, você pode criar um novo arquivo "d: /dir/file4.txt" através do código a seguir.
tente {file file3 = novo arquivo ("d: /dir/file4.txt"); file3.CreateNewFile ();} Catch (IoException e) {E.PrintStackTrace ();} Método 4
tente {uri uri = novo uri ("arquivo: /home/skywang/dir/file4.txt"); Arquivo de arquivo4 = novo arquivo (URI); file4.CreateNewFile ();} Catch (IoException e) {E.PrintStackTrace ();} ilustrar:
Semelhante ao "Método 3", exceto que o caminho completo é passado no "Método 3", enquanto o caminho completo é passado no "Método 4" é o URI correspondente ao caminho completo.
4. Exemplo de uso da API de arquivo
Para uso detalhado de APIs no arquivo, consulte o código de exemplo (filetest.java):
importar java.io.file; importar java.io.ioException; importar java.net.uri; importar java.util.calendar; importar java.text.simpledEformat; public class fileTest {public static void main (string [] args) {testFilestaticFields; testfiledirapis (); } public static void testFileStaticFields () {// Imprima o separador do caminho ":" System.out.printf ("file.pathseparator =/"%s/"/n", file.pathseparator); // Print Path Separator ':' System.out.printf ("file.pathseparatorchar =/"%c/"/n", file.pathseparatorchar); // imprima delimiter "/" System.out.printf ("file.separator =/"%s/"/n", file.separator); // print delimiter '/' System.out.printf ("file.separatorchar =/"%c/"/n", file.separator); // print delimiter '/' System.out.printf ("file.separatorchar =/"%c/"/n", file.separatorchar); } public static void testFiledirapis () {try {// crie novo diretório "Dir" Arquivo Dir = new File ("Dir"); Dir.mkdir (); // Método 1: Crie um novo diretório "dir/sub1". O diretório pai "dir" já deve existir! Arquivo sub1 = novo arquivo ("dir", "sub1"); sub1.mkdir (); // Método 2: Crie um novo diretório "Dir/Sub2". O diretório pai "dir" já deve existir! Arquivo sub2 = novo arquivo (dir, "sub2"); sub2.mkdir (); // Método 3: Crie um novo diretório "DIR/SUB3". MKDIRS () criará automaticamente um diretório pai que não existe. Arquivo sub3 = novo arquivo ("dir/sub3"); sub3.mkdirs (); // Método 4: Crie um novo diretório "Dir/Sub4". Criados de acordo com "Caminho Absoluto", os três primeiros métodos são criados com base no "caminho relativo". String dirpath = dir.getabsolutepath (); // Obtenha o caminho absoluto de "dir" string sub4abspath = dirpath + file.separator + "sub4"; // file.separator é o delimitador "/" arquivo sub4 = novo arquivo (sub4abspath); sub4.mkdirs (); // Método 5: Crie um novo diretório "DIR/SUB5". De acordo com o URI String URI_SUB5_PATH = "FILE:" + DIRPATH + FILE.SEPARADOR + "SUB5"; URI URI_SUB5 = novo URI (URI_SUB5_PATH); Arquivo sub5 = novo arquivo (uri_sub5); sub5.mkdirs (); // Método 1: Crie um novo arquivo "DIR/L1_NORMAL.TXT" FILE L1_NORMAL = NOVO FILE (DIR, "L1_NORMAL.TXT"); l1_Normal.CreateNewFile (); // Método 2: Crie um novo arquivo "dir/.l1_hide.txt". Arquivo l1_hide = novo arquivo ("dir", ".l1_hide.txt"); // No Linux, o arquivo começando com "". é um arquivo oculto. l1_hide.createnewfile (); // Método 3: Crie um novo arquivo "dir/l1_abs.txt". String dirabspah = dir.getabsolutepath (); // Obtenha o caminho absoluto da String dir L1_ABS_PATH = Dirabspah+File.Separator+"L1_Abs.txt"; Arquivo l1_abs = novo arquivo (l1_abs_path); l1_abs.createnewfile (); //System.out.printf("l1_abs_path=%S/n ", l1_abs_path); //System.out.printf("l1_abs path =%s/n ", l1_abs.getabsolutepath ()); // Método 4: Crie um novo arquivo "DIR/L1_URI.TXT". Crie um novo arquivo de acordo com o URI String URI_PATH = "FILE:" + Dirabspah + File.separator + "l1_uri.txt"; URI URI_L1 = novo URI (URI_PATH); //System.out.printf("uri_l1=%S/n ", l1_abs.getabsolutepath ()); Arquivo l1_uri = novo arquivo (uri_l1); l1_uri.createnewfile (); // Crie um novo arquivo "DIR/SUB/S1_NORMAL" FILE S1_NORMAL = NOVO FILE (SUB1, "S1_NORMAL.TXT"); s1_Normal.CreateNewFile (); System.out.printf (" %30s = %s/n", "s1_normal.exists ()", s1_normal.exists ()); System.out.printf (" %30S = %s/n", "s1_normal.getName ()", s1_normal.getName ()); System.out.printf (" %30s = %s/n", "s1_normal.getParent ()", s1_normal.getParent ()); System.out.printf (" %30S = %s/n", "s1_normal.getpath ()", s1_normal.getPath ()); System.out.printf (" %30S = %s/n", "s1_normal.getabsolutepath ()", s1_normal.getabsolutepath ()); System.out.printf (" %30s = %s/n", "s1_normal.getCanonicalPath ()", s1_normal.getCanonicalPath ()); System.out.printf ("%30S =%s IS/"%s/"/n", "s1_normal.lastmodified ()", s1_normal.LastModified (), getModifyTime (s1_normal.lastmodified ())); System.out.printf (" %30s = %s/n", "s1_normal.touri ()", s1_normal.Touri ()); // Liste "arquivos" e "pastas" no diretório "dir". // NOTA: Dir.ListFiles () apenas atravessará o diretório Dir, não os subdiretos do dir! System.out.println ("--- Lista arquivos e pastas ----"); Arquivo [] fs = dir.ListFiles (); para (arquivo f: fs) {string fname = f.getName (); String absst = f.isabsolute ()? "[Absoluto]": ""; String hiddenstr = f.ishidden ()? "[Escondido]" : ""; String dirst = f.isDirectory ()? "[Diretório]": ""; String filest = f.isfile ()? "[Arquivo]" : ""; System.out.printf ("%-30S%s%s%s%s/n", fname, filest, dirst, absst, hiddenstr); }} catch (Exceção e) {e.printStackTrace (); }} String estática privada getModifyTime (longa millis) {// obtenha calendário de objeto calendário calendário = calendar.getInstance (); // Defina o tempo para Millis Cal.setTimeInmillis (Millis); // Obtenha o objeto formatado, ele formatará a data de acordo com "AAAA-MM-DD HH: MM: SS" SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); //System.out.printf("Time %s/n ", str); return sdf.format (cal.gettime ()); }} Resultados em execução (resultados em execução no sistema Ubuntu 12.04, não no Windows!):
File.pathseparator = ":" file.pathseparatorchar = ":" file.separator = "/" file.separatorchar = "/" s1_normal.exists () = true s1_normal.getname () = s1_normal.txt s1_normal.getparent () = dir/Sub1 S1_nor. s1_normal.getabsolutepath () = /home/skywang/wind_talker/workout/java/skywang/io/io/src/file/dir/sub1/s1_normal.txt s1_normal.getConicalPath () = /home/skywang/wind_talker/workout/java/skywang/io/io/src/file/dir/sub1/s1_normal.txt s1_normal.lastmodified () = 138173006000 IS "2013-10-14 13:54:24" S173006000 IS "2013-10-14 13:54:24" Arquivo: /home/skywang/wind_talker/workout/java/skywang/io/io/src/file/dir/sub1/s1_normal.txt --- Lista arquivos e pastas ---- l1_uri.txt [arquivo] sub1 [diretório] l1_abs.txt [FILHE] [Arquivo] [Hidden] sub3 [diretório] sub2 [diretório] l1_normal.txt [arquivo]
Resultados: Ao executar o programa, um novo diretório "dir" será criado no diretório em que o arquivo de origem está localizado, seus subdiretos e subfiles. Como mostrado na figura abaixo:
FileDescriptor
O FileDescriptor é um "descritor de arquivo".
O FileDescriptor pode ser usado para representar arquivos abertos, soquetes abertos, etc.
Para representar um arquivo do FileDescriptor: Quando o FilDescriptor representa um arquivo, podemos simplesmente considerar o FileDescriptor como o arquivo. No entanto, não podemos operar no arquivo diretamente através do FileDescriptor; Se precisarmos operar no arquivo através do FileDescriptor, precisamos criar um FileOutputStream correspondente ao FileDescriptor e depois operar no arquivo.
em, fora, errar introdução
(1) In - Descritor para entrada padrão (teclado)
(2) Out - o descritor para saída padrão (tela)
(3) ERR - Os descritores da saída de erro padrão (tela) são semelhantes em princípio e uso. Vamos realizar pesquisas aprofundadas por toda parte.
1.1 O papel e o princípio de fora
OUT é o descritor para saída padrão (tela). Mas o que isso faz?
Podemos entendê -lo de uma maneira simples que o Out Out Representa Saída Padrão (tela). Se queremos produzir informações para a tela, podemos operá -las por fora; No entanto, o Out não fornece uma interface para produzir informações para a tela (porque o Out é essencialmente um objeto FileDescriptor, e o FileDescriptor não possui uma interface de saída). O que fazer?
É muito simples. Criamos o "Objeto de fluxo de saída" correspondente ao out e, em seguida, produzimos as informações para a tela através da interface de saída, como Write () do "Stream de saída". O seguinte código:
tente {fileOutputStream out = new FileOutputStream (FileDescriptor.out); out.Write ('A'); out.close ();} catch (ioexception e) {} Execute o programa acima e a letra 'A' será emitida na tela.
Para facilitar nossa operação, o Java há muito tempo encapsulou a "interface que pode facilmente gerar informações na tela" para nós: através do System.out, podemos facilmente gerar informações para a tela.
Portanto, podemos converter equivalentemente o programa acima no código a seguir:
System.out.print ('A'); Vamos falar sobre os princípios dos dois códigos acima para ver a definição de Out. Sua definição está no FileDescriptor.java, e o código -fonte relevante é o seguinte:
Classe final pública FilDescriptor {private int fd; public static final fileDescriptor Out = new FileDescriptor (1); private fileDescriptor (int fd) {this.fd = fd; USECOUNT = new AtomicInteger (); } ...} A partir disso, pode -se ver que
(1) OUT é um objeto FileDescriptor. É criado através do construtor FileDescriptor (int fd).
(2) Operação FileDescriptor (int FD): Atribua valores ao objeto FD (INT Type) e crie uma nova variável de contagem usando o USECOUNT.
O objeto FD é uma variável muito importante. "fd = 1" representa "saída padrão", "fd = 0" representa "entrada padrão" e "fd = 2" representa "saída de erro padrão".
FileOutputStream Out = new FileOutputStream (FileDescriptor.out);
É para usar o FileOutputStream do construtor (FileDescriptor FDOBJ) para criar o "Objeto FileOutputStream correspondente ao arquivo.out".
Sobre como o System.out é definido. Você pode se referir a "compreensão profunda do System.out.println (" Hello World ")"
Através do aprendizado acima, sabemos que podemos personalizar os fluxos de descritores de arquivos padrão [ou seja, em (entrada padrão), out (saída de erro padrão) e ERR (saída de erro padrão)] para concluir a função de entrada/saída; No entanto, o Java encapsulou a interface correspondente para nós, ou seja, podemos usar o System.in, System.out, System.err de maneira mais conveniente.
Além disso, também podemos personalizar os descritores de arquivos para "arquivo", "soquete" etc. e depois operá -los. Consulte o TestWrite (), o testRead () e outras interfaces no código de exemplo a seguir.
2. Código de amostra
O código -fonte é o seguinte (FileDescriptEortest.java):
importar java.io.printstream; importar java.io.filedescriptor; importar java.io.fileInputStream; importar java.io.fileOutputStream; importar java.io.ioexception; classe pública FiledEdEstorTest {private static string filename = "file.txt";; String final estática privada outtext = "Hi FilDescriptor"; public static void main (string [] args) {testWrite (); testRead (); testStandfd (); //System.out.println(outText); } /*** Programa de teste de FileDescriptor.out** O efeito deste programa é equivalente a system.out.println (outtext); */ private estático void testStandfd () {// Crie o PrintStream PrintStream correspondente out = new PrintStream (new FileOutputStream (FileDescriptor.out)); // output "hi fileDescriptor" na tela out.println (outtext); out.Close (); } /*** Programa de amostra de redação do FileDescriptor** (1) para ilustrar, "Criando o FileOutputStream pelo nome do arquivo" é equivalente a "Criando o FileOutputStream por descritor de arquivo" Objeto* (2) O programa criará um novo arquivo "File.txt" no diretório onde "o arquivo de origem" está localizado e o conteúdo do arquivo é "aa". */ private estático void testWrite () {try {// Crie objeto FileOutputStream correspondente ao arquivo "file.txt" FileOutputStream out1 = new FileOutputStream (nome do arquivo); // Obtenha o "Descritor de arquivo" correspondente ao arquivo "file.txt" FileDescriptor fdout = out1.getfd (); // Crie o objeto "FileOutputStream" com base no FileOutputStream FileOutputStream out2 = novo FileOutputStream (FDOUT); out1.Write ('A'); // escreva 'a' para "file.txt" via out1 out2.Write ('a'); // escreva 'a' para "file.txt" via out2 if (fdout! = Null) system.out.printf ("fdout ( %s) é %s/n", fdout, fdout.valid ()); out1.close (); out2.close (); } catch (ioexception e) {e.printStackTrace (); }} / *** FileDescriptor Sample Program** para ilustrar "Crie FileInputStream pelo nome do arquivo" é equivalente a "Criar fileInputStream pelo descritor de arquivo" Objeto* / private static void testRead () {TryStream {// Create FileInpStream correspondente ao arquivo ".txt "FileIn; // Obtenha o "Descritor de arquivo" correspondente ao arquivo "file.txt" FileDescriptor fdin = in1.getfd (); // Crie o objeto "FileInputStream" de acordo com o FileIrtStream "FileIntStream in2 = new FileInputStream (FDIN); System.out.println ("in1.read ():"+(char) in1.read ()); System.out.println ("in2.read ():"+(char) in2.read ()); if (fdin! = null) system.out.printf ("fdin ( %s) é %s/n", fdin, fdin.valid ()); in1.close (); in2.Close (); } catch (ioexception e) {e.printStackTrace (); }}} Resultados em execução:
fdout (java.io.filedescriptor@2b820dda) é realidade1.read (): ain2.read (): afdin (java.io.filedescriptor@675b7986) é trueHi FilDescriptor