Avatar billede casualty Nybegynder
24. juni 2003 - 21:51 Der er 22 kommentarer og
1 løsning

Hive bytes ud af en ArrayList og samle dem.

Jeg sidder for sjov og leger med filer...
Jeg har læst en fil ind med en FileReader og gemmer 1000 bytes af gangen som et byte array, i en arraylist...

er der nogen der kan/vil vise mig hvorledes jeg kan "samle" filen igen.
Altså hive plads 0 i arraylisten ud (1000b) og skrive dem via en FileWriter, herefter hive de næste 1000 bytes ud og skrive dem osv...

--------------For at give en bedre ide om hvad jeg snakker om så har jeg her postet koden der gemmer bytes i en arraylist:

public SaveFile(File f)
  {
    FileInputStream fis;
    try
    {
      fis = new FileInputStream(minFil);
      int n;
      byte[] b = new byte[1000];
      while((n = fis.read(b)) >= 0)
      {
        arrayList.add(b);
      }
    }
    catch(Exception e)
    {
    }
  }

Mvh Casualty
Avatar billede casualty Nybegynder
24. juni 2003 - 21:52 #1
Jeg ved godt at det er en lidt pudsig opgave..men den er god til at lære mig lidt om filer osv...
Avatar billede arne_v Ekspert
24. juni 2003 - 22:03 #2
Jeg kan ikke rigtigt se hvad du skal skal bruge den ArrayList til,
hvorfor ikke bare appende til en StringBuffer ?
Avatar billede arne_v Ekspert
24. juni 2003 - 22:05 #3
Logikken er vel ikke engang helt korrekt, fordi du gemmer ikke n,
d.v.s. at hvis n < 1000 så ved du ikke hvor meget at byte arrayet der
er validt.
Avatar billede casualty Nybegynder
24. juni 2003 - 22:07 #4
Det virker ellers...Jeg prøvede med filer under 1000 byte og skrev kun den første plads i arraylisten ud...Derefter havde jeg en valid fil..
Avatar billede casualty Nybegynder
24. juni 2003 - 22:08 #5
Ok...Skulle jeg så appende byte efter byte til en stringbuffer?
Avatar billede arne_v Ekspert
24. juni 2003 - 22:09 #6
Jeg tænkte nok mere på:

sb.append(new String(b, 0, n));
Avatar billede arne_v Ekspert
24. juni 2003 - 22:11 #7
Hm.

Og den skrev ikke 1000 bytes ud til filen ?
Avatar billede casualty Nybegynder
24. juni 2003 - 22:12 #8
Oki...Jeg prøver lidt videre..
Avatar billede casualty Nybegynder
24. juni 2003 - 22:15 #9
Jo det har du ret i...Jeg så det ikke da det bare var en .txt og der stod det i den som der skulle
Avatar billede disky Nybegynder
24. juni 2003 - 22:15 #10
Er dit problem at hive ud af din arrayList ?

gør:

Iterator iter=arrayList.iterator();
while(iter.hasNext())
{
  System.Object obj=iter.next();
}
Avatar billede arne_v Ekspert
24. juni 2003 - 22:16 #11
Alternativt:
  - find filens størrelse
  - alloker et byte array af den størrelse
  - brug read(b, ix, b.length - ix)
Avatar billede casualty Nybegynder
24. juni 2003 - 22:16 #12
Ok næste spørgsmål...Hvodan får jeg så skrevet fra Stringbufferen ud til en fil igen??
Avatar billede casualty Nybegynder
24. juni 2003 - 22:17 #13
Ja det kunne jeg også prøve..
Avatar billede arne_v Ekspert
24. juni 2003 - 22:19 #14
Du kan konvertere tilbage fra StringBuffer til byte[] med
sb.toString().getBytes() !
Avatar billede casualty Nybegynder
24. juni 2003 - 22:20 #15
Ok tak
Avatar billede casualty Nybegynder
24. juni 2003 - 22:22 #16
Jeg kan ikke lave at byteArray med længden på filen da denne er en long??
Avatar billede casualty Nybegynder
24. juni 2003 - 22:24 #17
Tak Disky...Men problemet var mere at få det hele hægtet sammen med min filewriter
Avatar billede arne_v Ekspert
24. juni 2003 - 22:24 #18
Cast den til en int.
Avatar billede arne_v Ekspert
24. juni 2003 - 22:25 #19
Hvis den er så stor at den ikke kan være i en int, så løber du nok
alligevel tør for memory !

:-)
Avatar billede arne_v Ekspert
24. juni 2003 - 22:42 #20
3 stykker kode:

import java.io.*;

public class CopyManyWays {
    public static void main(String[] args) {
        copy1("c:\\tst0.fil", "c:\\tst1.fil");
        copy2("c:\\tst0.fil", "c:\\tst2.fil");
        copy3("c:\\tst0.fil", "c:\\tst3.fil");
    }
    public static void copy1(String fnm1, String fnm2) {
        try {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fnm1));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fnm2));
            byte[] b = new byte[1000];
            int n;
            while((n = bis.read(b)) >= 0) {
                bos.write(b, 0, n);
            }
            bis.close();
            bos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
    public static void copy2(String fnm1, String fnm2) {
        File f = new File(fnm1);
        int n = (int)f.length();
        byte[] b = new byte[n];
        try {
            InputStream is = new FileInputStream(fnm1);
            OutputStream os = new FileOutputStream(fnm2);
            is.read(b);
            os.write(b);
            is.close();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
    public static void copy3(String fnm1, String fnm2) {
        try {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fnm1));
            OutputStream os = new FileOutputStream(fnm2);
            byte[] b = new byte[1000];
            int n;
            StringBuffer sb = new StringBuffer();
            while((n = bis.read(b)) >= 0) {
                sb.append(new String(b, 0, n));
            }
            bis.close();
            os.write(sb.toString().getBytes());
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
}
Avatar billede arne_v Ekspert
24. juni 2003 - 22:43 #21
og et svar
Avatar billede casualty Nybegynder
24. juni 2003 - 22:45 #22
Det er bare fedt...Jeg kigger lige på din kode...Jeg fik det til at virke med et byteArray.

1000 Tak for hjælpen
Avatar billede arne_v Ekspert
24. juni 2003 - 22:47 #23
Der er ikke noget specielt ved min kode.

Det er bare det samme som jeg allerede har fortalt bare i komplet
kode form.
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

IT-JOB

Capgemini Danmark A/S

Open Application (Denmark)

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Senior Platform Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger IT-supporter til Lokal IT Servicecenter i Karup