Avatar billede 2c Nybegynder
14. februar 2004 - 22:30 Der er 9 kommentarer og
1 løsning

Fil håndtering

Mit problem.

Jeg modtager en fil fra en applikation som er på en anden computer. Mit problem er at protokollen der bliver benyttet er udp. Jeg modtager filen i byte arrays (byte[]). Jeg kan nemt skrive et array til en fil. Men jeg vil gerne vide hvornår jeg har modtaget hele filen, og og så skrive hele filen til en fil. Håber i forstår. 

Min kode:

while (true){
s.receive(packet);
buffer =packet.getData();
.........
skriv til fil, og hvis eof, luk fil.
.........
}
Avatar billede 2c Nybegynder
14. februar 2004 - 22:31 #1
buffer er foresten:

byte[] buffer = new byte[10];
Avatar billede arne_v Ekspert
14. februar 2004 - 22:33 #2
Lav en lille protokol og send:

2 eller 4 bytes med længden X
X bytes med selve filen
Avatar billede arne_v Ekspert
14. februar 2004 - 22:35 #3
Har I indbygget noget i jeres protokol ovenpå UDP til at håndtere
packet loss og out of order ?
Avatar billede 2c Nybegynder
14. februar 2004 - 22:40 #4
Nej, det er bare en mindre skole opgave. Vi skal ikke tage højde for at udp er upålidelig.

Jeg prøver lige at implementere som du foreslog det. Jeg havde bare håbet at der ville være et end of file tegn i byte arrayet. (Java fil håndtering er ikke min stærke side.)
Avatar billede arne_v Ekspert
14. februar 2004 - 22:43 #5
Hvis I ved at det er en tekst fil kan I lave en konvention om at 26 (CTRL/Z)
er EOF.

Men den duer ikke ved binære filer.

Længde prefix er en solid velgennemprøvet løsning !
Avatar billede 2c Nybegynder
14. februar 2004 - 23:57 #6
Det er en god løsning. Mit problem er bare nu: Jeg ved ikke hvordan man konvertere fra: int -> byte[4] -> int.
Avatar billede 2c Nybegynder
15. februar 2004 - 03:28 #7
Så fandt jeg ud af det, blandt andet med hjælp fra din artikel om "Basal type konvertering i Java" :-)

Lægger du et svar ? Så du kan få dine point.
Avatar billede arne_v Ekspert
15. februar 2004 - 10:21 #8
svar
Avatar billede arne_v Ekspert
15. februar 2004 - 10:22 #9
Hvis man gerne vil være fri for selv at fedte med de konverteringer
så kan man bruge DataInputStream og DataOutputStream i begge ender.
Avatar billede arne_v Ekspert
15. februar 2004 - 10:23 #10
Eksempel (dog til fil ikke socket):

import java.io.*;

public class BinFile {
  private static void store(DataOutputStream dos, int iv, double xv, String sv) throws IOException {
      dos.writeInt(iv);
      dos.writeDouble(xv);
      dos.writeByte(sv.length());
      dos.write(sv.getBytes());
  }
  private static void load(DataInputStream dis) throws IOException {
      int iv = dis.readInt();
      double xv = dis.readDouble();
      int len = dis.readUnsignedByte();
      byte[] b = new byte[len];
      dis.read(b);
      String sv = new String(b);
      System.out.println(iv + " " + xv + " " + sv);
  }
  public static void main(String[] args) throws IOException {
      DataOutputStream dos = new DataOutputStream(new FileOutputStream("C:\\test.bin"));
      store(dos, 123, 123.456, "ABC");
      store(dos, -1, -2.5, "123");
      dos.close();
      DataInputStream dis = new DataInputStream(new FileInputStream("C:\\test.bin"));
      while(dis.available() > 0) {
        load(dis);
      }
      dis.close();
  }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester