Avatar billede tommer Nybegynder
22. oktober 2002 - 14:47 Der er 46 kommentarer og
1 løsning

læs og gem fil

jeg vil gerne læse en fil (.gif) for derefter at gemme den i en ny fil(.gif)
kan nogen give et eksempel på det ??
Avatar billede medions Nybegynder
22. oktober 2002 - 14:53 #1
tommer> Det er vidst noget med man ikke kan de i Java, da det strider imod reglerne... -altså man kan ikke gemme .gif filer,-ved egentlig ik' om man kan åbne dem... (kun noget jeg har hørt!)

//>Rune
Avatar billede tommer Nybegynder
22. oktober 2002 - 14:57 #2
det kan man godt... jeg kan læse filen men når jeg laver en ny kommer der en fil som der skal, men den er bare tom.
jeg gør sådan her:
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
DataOutputStream tofile = new DataOutputStream(new FileOutputStream("test.gif"));
  String line = inFromServer.readLine();
  while (line !=null){
  tofile.writeBytes(inFromServer.readLine());
  line = inFromServer.readLine();
  }
Avatar billede disky Nybegynder
22. oktober 2002 - 15:02 #3
du kan ikke bruge .readLine() på en binær fil !!

brug:
        byte buf[]=new byte[65536];
        try
        {
            int size,temp,fileSize;
           
            in=new FileInputStream(inName);
            fileSize=in.read(buf);
            in.close();

            FileOutputStream out=new FileOutputStream(outName);
            out.write(buf,0,fileSize);
                out.close();
                      }
catch(IOException e)
{
e.printStackTrace(System.out);
}

p.s. kan max gøre det med 65536 bytes, ellers ret buffer størrelsen, i en smuk løsning læser den via en bufferedstream, men dette virker
Avatar billede tommer Nybegynder
22. oktober 2002 - 15:05 #4
ok disky, jeg prøver lige...
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 15:07 #5
import java.io.*;

public class gifEksempel {
   
    public static void main(String[] args) {
        BufferedOutputStream dest = null;
    int BUFFER = 2048;
       
        try {
            FileInputStream fis = new FileInputStream("c:\\some.gif");
            int count;
            byte data[] = new byte[BUFFER];

            FileOutputStream fos = new FileOutputStream("c:\\other.gif");
            dest = new BufferedOutputStream(fos, BUFFER);
            while ((count = fis.read(data, 0, BUFFER)) != -1) {
                dest.write(data, 0, count);
            }

            dest.flush();
            dest.close();
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
}
Avatar billede disky Nybegynder
22. oktober 2002 - 15:07 #6
ret lige
in=new FileInputStream(inName);

til
FileInputStream in=new FileInputStream(inName);

Husk at skift inName og outName ud med dine ønskede filnavne.

p.s. koden ser lidt mystisk ud da den er taget ud fra en større del.
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 15:09 #7
UPS, så ikke lige at disky var kommet mig i forkøbet... Sorry! :)
Avatar billede disky Nybegynder
22. oktober 2002 - 15:12 #8
Det gør ikke det mindste, din løsning er den pæne jeg beskriver :)
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 15:15 #9
Men den kunne dog blive pænere ved ikke at bruge hardcodede værdier og stort begyndelses bogstav i klasse navnet..*rødme* sorry... og desuden ikke fange Exception men derimod IOException men hvad kan jeg sige, det skulle gå hurtigt... :)
Avatar billede disky Nybegynder
22. oktober 2002 - 15:19 #10
Yep, og der er ingen grundt til at kalde .flush() hvis du kalder .close() bagefter, og din buffer størrelse skulle du nok lave som en

static final int istedet for en int.

Og din måde at sætte {}'ere er frygtelig grim, synes jeg, jeg forstår ganske enkelt ikke SUN har valgt den som deres forslag til codeconvention, men jeg ved fra venner hos SUN, at de ikke engang selv er konsekventer imens de udvikler :)

Nå ja og så gemmer man det selvfølgelig i en metode istedet for i main() metoden :)

Kan vi ellers finde andet vi kan være efter :)
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 15:27 #11
Neeej, mon ikke det skulle kunne klare det?

Jeg mener dog at mine {} er sat rigtigt (og pænt). Men det er nu mere en smagssag! :)

Jeg vil iøvrigt gå med til at den KAN være final hvis jeg ikke vil kunne ændre den inden for metoden, men static kan den ikke være når den står i en main metode, så skal den flyttes op (uden for metoden).

Jeg synes nu heller ikke dette lille eksempel fortjener en metode for sig, men det må være op til hver enkelt at bedømme! :)
Avatar billede tommer Nybegynder
22. oktober 2002 - 15:27 #12
>caspermadsen jeg får filen fra en server via BufferedReader, hvordan putter jeg det over i :
FileInputStream fis = new FileInputStream("c:\\some.gif");
???
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 15:35 #13
Jamen så er din BufferedReader bare din "in stream" istedet for fis (input filen). Ellers behandles det på samme måde.
Avatar billede arne_v Ekspert
22. oktober 2002 - 15:38 #14
Tja. Hans kode ser da ud til at gøre hvad der blev ønsket.

Din kode læser en størrelse -128..127 fra en fil og skriver det
antal bytes til en anden fil, hvilket vel ikke kopierer en GIF fil.
Avatar billede disky Nybegynder
22. oktober 2002 - 15:38 #15
byt
FileInputStream fis = new FileInputStream("c:\\some.gif");

ud med
BufferedReader fis = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));


så virker det.

casper:
Ja den med {} blvier vi aldrig enige om, jeg synes de skal stå over hinanden så man kan se hvilke der hører sammen, som netop gør det overskueligt :)
Avatar billede disky Nybegynder
22. oktober 2002 - 15:39 #16
arne:
Hvem er du nu efter ? :-)
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 15:44 #17
disky :

Jeg mener start { skal stå for enden, da man så netop sparer en linie, og derved kan få overblikket over ens kode (behøves ikke at scrolle etc.)

Desuden kan man jo altid se på indrykket (1 tab) hvad der hører til hvad...

Så nej vi bliver nok ikke enige på det punkt! :)
Avatar billede arne_v Ekspert
22. oktober 2002 - 15:46 #18
Jeg fandt det bare mere væsentligt end den gamle diskussion om
K&R style versus Modified K&R style.
Avatar billede disky Nybegynder
22. oktober 2002 - 15:48 #19
Med de skærm opløsninger man kører idag betyder det at spare en linie ingen ting.

Tilgengæld gør det at flytte den hen til enden at man ikke lægger mærke til den osv.

Men helt enig, vi bliver aldrig enige på dette punkt.

Men jeg hader folk der fjerner tomme linier for at spare plads, jeg foretrækker overskuelig og åben kode, fremfor folk der f.eks. har en while som denne her:

while( (x=metode(a?b:c))!=metode2(tal*metode3(c)))
{

Osv, det gavner bestemt ikke overskueligheden, eller gir let læsbar kode, og med de kompilere vi har idag, hjælper det slet ikke noget.

Jeg siger ikke du kunne finde på det, men det er bare et eksempel på kode jeg møder til hverdag. Så er det forresten også et mareridt at debugge.
}
Avatar billede tommer Nybegynder
22. oktober 2002 - 15:48 #20
disky:
compileren siger cannot resolve symbol:
symbol  : method read  (byte[],int,int)
location: class java.io.BufferedReader
            while ((count = fis.read(data, 0, BUFFER)) != -1)
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 15:48 #21
arne_v:

:-) Sorry!
Avatar billede disky Nybegynder
22. oktober 2002 - 15:48 #22
arne:
Du svarer ikke på det man spørger om.
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 15:50 #23
tommer:

Det er fordi du fulgte disky's anvisninger, lad være med det! :)
Avatar billede tommer Nybegynder
22. oktober 2002 - 15:51 #24
caspermadsen: hvad så ???
Avatar billede arne_v Ekspert
22. oktober 2002 - 15:55 #25
Hvad svarer jeg ikke på ? Du sendte noget kode ud som laver
noget helt andet end det blev spurgt om. Og jeg påpegede det.
Fordi det er mere relevant om koden løser opgaven end hvilken
bracket style man bruger.
Avatar billede disky Nybegynder
22. oktober 2002 - 15:55 #26
casper:
Så så, eller skal du have tæv med en 'Effective Java' af Joshua Bloch (fed bog forresten) :-)))

Nå nu smutter jeg hjem.
Avatar billede disky Nybegynder
22. oktober 2002 - 16:00 #27
arne:
Hvad snakker du om ?

Den læser om til 65536 bytes og gemmer antal læste bytes i en ny fil.

Istedet for bare at brokke dig skulle du hellere komme med et konstruktivt forslag, istedet for det kævleri.
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 16:08 #28
disky:

*LOL* Jeps, i've got it! :)
Jeg påpegede bare at vi begge svarede for hurtigt på tommers spørgsmål... Men det sker jo... :)
Kom godt hjem! :)

tommer:
Problemet er at din BufferedReader behandler char's og ikke bytes.
Men dette kan løses ved hjælp af sun.io.CharToByteASCII() klassen.
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 16:12 #29
Hvis du styrer serveren, ville jeg istedet foreslå at du bruger byte's over hele linien, så undgår du nemlig tab med konvertering af chars, da der ingen grund er til det. Når du vælger en CharToByte....() klasse skal du nemlig vide om det er ASCII eller...? disse problemer vil du undgå hvis du bruger byte's istedet for chars.

Håber det hjælper.
Avatar billede arne_v Ekspert
22. oktober 2002 - 16:37 #30
disky>

Kan du forklare mig hvor i:

in=new FileInputStream(inName);
fileSize=in.read(buf);
in.close();

FileOutputStream out=new FileOutputStream(outName);
out.write(buf,0,fileSize);
out.close();

du læser (op til) 65536 bytes ?

Så vidt jeg kan se læser du den første byte fra input filen med
værdi -128 .. 127 og skriver det antal bytes til output filen !?
                                                }
Avatar billede arne_v Ekspert
22. oktober 2002 - 17:01 #31
Tommer>

Prøv den her kode:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Copy {
    public static void copy(String ifnm, String ofnm) throws IOException {
        FileInputStream istm = new FileInputStream(ifnm);
        FileOutputStream ostm = new FileOutputStream(ofnm);
        int b;
        while(istm.available() > 0) {
            b = istm.read();
            ostm.write((byte)b);
        }
        return;
    }
    public static void main(String[] args) throws Exception {
        copy(args[0], args[1]);
        return;
    }
}

Jeg har testet den på et par ZIP-file af MB størrelse og de kunne
læses efter kopiering !

:-)
Avatar billede arne_v Ekspert
22. oktober 2002 - 17:03 #32
disky>

Jeg synes ikke, at det er "kævleri", når man påpeger, at kode ikke
laver det som det burde.
Avatar billede disky Nybegynder
22. oktober 2002 - 20:15 #33
arne:
Taget fra InputStream's API om read(byte[]) metoden:
public int read(byte[] b)
        throws IOExceptionReads up to b.length bytes of data from this input stream into an array of bytes. This method blocks until some input is available.

Så vidt jeg kan se, læser den som forventet om til b.length tegn altså op til 65536 som jeg nævnte.

Der står også det er 'BYTES' den læser !!, og om de så har værdier imellem -128 og 128 eller 0-255 betyder ikke det fjerneste da de bliver skrevet lige bagefter.

Forresten dit sidste eksempel er ikke særligt godt, det performer ca. så dårligt som det kan da du læser/skrive 1 byte af gangen, pak dem ind  en Buffer først.


p.s. Api'en fra SUN er rigtig god hjælp :-)
Avatar billede arne_v Ekspert
22. oktober 2002 - 21:11 #34
Jeg har vist fået blandet forskellige read metoder sammen.

Jeg undskylder.

Mit eksempel er ikke optimalt performance-mæssigt,
men det virker. Med alle fil-størrelser.
Avatar billede disky Nybegynder
22. oktober 2002 - 21:15 #35
arne:
Det glæder mig vi blev enige, jeg kunne heller ikke forstå din udtalelse.

Men det er helt korrekt, at hvis jeg ikke havde en byte[] i metode kaldet ville den kun hente 1 byte.
Avatar billede caspermadsen Nybegynder
23. oktober 2002 - 10:03 #36
arne:
Dit svar er heller ikke lige hvad tommer vil have, da han ikke har filer, men derimod en BufferedReader som han påpeger til mig et sted...

Men, men... lad os vente og høre fra tommer, om det virker! Eller ej... :)
Avatar billede tommer Nybegynder
23. oktober 2002 - 10:09 #37
>caspermadsen.. jeg roder rundt i alle jeres forslag (hjææææælp)
det jeg vil er at klienten sender navnet på filen den skal bruge til serveren. serveren skal hente filen og sende den tilbage til klienten.
det jeg er kommet frem til ved jeg ikke om er rigtigt, her kommer min server så kan du måske kigge lidt på den ;-)  :
import java.io.*;
import java.net.*;

class TCPServer
{
  public static void main (String args[]) throws Exception
  {
    String clientSentence=null;
    ServerSocket welcomeSocket= new ServerSocket (6789);
       
        while (true)
        {
          Socket connectionSocket = welcomeSocket.accept();
       
          DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
          DataInputStream inFomClient = new DataInputStream(connectionSocket.getInputStream());
                   
          clientSentence = new Integer(inFomClient.read()).toString();
         
          FileInputStream  fis = new FileInputStream(clientSentence);
          int b;
            while(fis.available() > 0)
            {
              b = fis.read();
              outToClient.write((byte)b);
            }//slut while
       
        }//slut while
    }//slut main
}//slut class     


ps jeg har ikke testet det endnu :0
tommer
Avatar billede tommer Nybegynder
23. oktober 2002 - 10:10 #38
husk jeg er nybegynder ;-)
Avatar billede caspermadsen Nybegynder
23. oktober 2002 - 10:41 #39
Ok, den er HELT gal... :)

inFromClient.read() læser kun 1 tegn(byte), som du sender ind til en Integer (hel tal), og så henter du dit nye objekts reference (hel talets)ud med toString() og ligger det ind i clientSentence... Jeg er RET overbevist om at det ikke er det du vil! :D

Istedet skal du lave følgende (ikke testet):
BufferedReader d = new BufferedReader(new InputStreamReader(new DataInputStream(System.in)));
            FileInputStream fis = new FileInputStream(new File(d.readLine()));

Resten ser for så vidt godt nok ud... :)

Men som sagt har jeg ikke testet, så du må lige selv prøve det...
Avatar billede caspermadsen Nybegynder
23. oktober 2002 - 10:45 #40
Dit eksempel bliver så noget lignende dette :

import java.io.*;
import java.net.*;

class TCPServer
{
  public static void main (String args[]) throws Exception
  {
    String clientSentence=null;
    ServerSocket welcomeSocket= new ServerSocket (6789);
       
        while (true)
        {
          Socket connectionSocket = welcomeSocket.accept();
       
          DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
          DataInputStream inFomClient = new DataInputStream(connectionSocket.getInputStream());
                   
          BufferedReader d = new BufferedReader(new InputStreamReader(inFomClient));
          FileInputStream fis = new FileInputStream(new File(d.readLine()));

          int b;
            while(fis.available() > 0)
            {
              b = fis.read();
              outToClient.write((byte)b);
            }//slut while
       
        }//slut while
    }//slut main
}//slut class

Håber det er nogenlunde forståeligt... :)
Avatar billede tommer Nybegynder
23. oktober 2002 - 10:48 #41
tak casper, jeg prøver lige..
tommer
Avatar billede caspermadsen Nybegynder
23. oktober 2002 - 10:48 #42
Grunden til at der skal være BufferedReader alligevel er at du skal have filnavnet ud (og da det er karakterer så nytter det ikke rigtig at bruge byte's der).

Jeg håber ikke vi har forvirret dig mere end hvad godt er, men det er et besværligt område for nybegyndere, det kunne godt være du skulle prøve noget der er lidt lettere først. :)

Held og lykke med det! :)
Avatar billede caspermadsen Nybegynder
23. oktober 2002 - 10:49 #43
tommer :

velbekomme! :)
Avatar billede tommer Nybegynder
23. oktober 2002 - 12:12 #44
casper:
jeg prøver at lave en klient til det vi lige er kommet frem til med serveren.
jeg er nok helt forkert på den igen :0 eller hvad ?
den kommer her:
import java.io.*;
import java.net.*;

class TCPClient{

public static void main(String[] args)throws Exception{
  String sentence;
  //String s;
  BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
  Socket clientSocket = new Socket("localhost", 6789);
  DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
  sentence = inFromUser.readLine();
  outToServer.writeBytes(sentence+'\n');
 
  DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream());

  DataOutputStream fos = new DataOutputStream(new FileOutputStream(sentence));
 
        while(inFromServer.available() >0)
        {
          fos.write(inFromServer.readByte()); 
        }
       
         
  fos.close();
  clientSocket.close();
 
}

}

der dannes en ny fil men den er tom ??
nu skal du nok snart få fred og points ;-)
Avatar billede caspermadsen Nybegynder
23. oktober 2002 - 12:30 #45
Hmmm... umiddelbart ser det faktisk fornuftigt ud synes jeg... Men generelt er jeg slet ikke sikker på du kan det du prøver på... lad mig forstå det rigtigt...

1.Brugeren indtaster en billede url.
2.Denne url sendes til serveren
3.Serveren returnerer en gif
4.Giffen gemmes på klienten.

Er det rigtig forstået?

Hvis det er, hvorfor så ikke bare fyre en url af mod en apache, og derved få billedet?? og så køre det over http. Ville det ikke være meget lettere, eller er der noget jeg har helt misforstået?
Avatar billede tommer Nybegynder
23. oktober 2002 - 12:48 #46
du har forstået det rigtigt (men ikke kun billeder, alle slags filer !)

du har nok ret mht http (har aldrig prøvet) ;-)

men, øvelse gør mester !!

points er dine
zez tommer
Avatar billede caspermadsen Nybegynder
23. oktober 2002 - 12:51 #47
Du kan bare poste flere spørgsmål så tager vi dem som det kommer! :)
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