Avatar billede netsrac Praktikant
07. september 2001 - 17:26 Der er 14 kommentarer og
2 løsninger

java og zip

Hm..jeg har lidt problemer med at hente de binære data fra en given fil fra en given zipfil, her er lidt kode:

    public byte[] getBinaryData(String entryName)
    {
        byte[] zipData = new byte[0];
        ZipInputStream zipReader = new ZipInputStream(new InputStream());
        ZipEntry zip;
       
        for (Enumeration e = myzip.entries(); e.hasMoreElements();)
        {
                zip = zipReader.getNextEntry();
                if (zip.getName() == entryName)
                {
                    zipReader.read(zipData, 0, zip.getSize());
                }
        }
        return zipData;
    }

Jeg får denne fejl:

cnhwebZip.java:86: java.io.InputStream is abstract; cannot be instantiated
        ZipInputStream zipReader = new ZipInputStream(new InputStream());


Jeg kan åbenbart ikke oprette en InputStream, hvad skal jeg så gøre ?
Avatar billede stine_grith Nybegynder
07. september 2001 - 17:42 #1
Du kan ikke lave objekter af en abstract klasse -
dvs new InputStream() kan ikke lade sig gøre.

men hvordan du ellers skal løse dit problem skal jeg ikke lige umiddelbart kunne sige

/Stine
Avatar billede netsrac Praktikant
07. september 2001 - 17:44 #2
Det er bare det at i dokumentationen for ZipInputStream står der at man skal give en InputStream med som parameter:

http://java.sun.com/j2se/1.3/docs/api/java/util/zip/ZipInputStream.html
Avatar billede stine_grith Nybegynder
07. september 2001 - 18:16 #3
Det du gør er at lave din egen klasse fx:

public class A extends InputStream {
}

InputStream i = new A();
ZipInputStream zipReader = new ZipInputStream(i);

nogenlunde som dette, jeg har ikke lige prøvet.

/Stine
Avatar billede disky Nybegynder
07. september 2001 - 19:10 #4
netsrac:

Du skal bruge en InputStream eller en klasse der arver fra InputStream.

Hvis du kan vente til Mandag, har jeg et komplet fungerende eksempel på arbejdet.

Du kan f.eks. bruge en af følgende:

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream

Jeg brugte selv en ByteArrayInputStream mener jeg :)
Avatar billede logical Nybegynder
07. september 2001 - 19:41 #5
Lav det således:

ZipInputStream zipReader = new ZipInputStream(new FileInputStream(\"filnavn.zip\"));
Avatar billede netsrac Praktikant
07. september 2001 - 23:11 #6
Okay, så kom jeg videre, hjælp mig lige med denne også, fatter det simpelt hen ikke:

    public byte[] getBinaryData(String entryName)
    {
        byte[] zipBytes = new byte[0];
        ZipInputStream zipReader = new ZipInputStream(new FileInputStream(file));
        ZipEntry zip;
       
        for (Enumeration e = myzip.entries(); e.hasMoreElements();)
        {
                zip = zipReader.getNextEntry();
                if (zip.getName() == entryName)
                {
                    zipReader.read(zipBytes, 0, zip.getSize());
                }
        }
        return zipBytes;
    }

Giver compile error:

cnhwebZip.java:96: cannot resolve symbol
symbol  : method read  (byte[],int,long)
location: class java.util.zip.ZipInputStream
                    zipReader.read(zipBytes, 0, zip.getSize());
                                                ^

Den brokker sig altså over det med byte[] arrayet, men det skulle da være okay ?
Avatar billede logical Nybegynder
08. september 2001 - 06:59 #7
Nej, byte arrayet er fint, bortset fra at det på kørselstidspunktet ikke kan indeholde nogle data, da det er erklæret med 0 pladser.

Dit problem skyldes, at man skal angive en byte[], en int og en int for at få read til at virke, men prøv med følgende:


if (zip.getName().equals(entryName))  <- Lav sammenligningen således
{
  byte[] zipBytes = new byte[zip.getSize()];  <- Tilføjet
  zipReader.read(zipBytes);  <-Rettet til.
}
Avatar billede netsrac Praktikant
08. september 2001 - 10:27 #8
Gør jeg det på den måde får jeg at byte måske ikke er initaliseret, gør jeg det på følgendende måde får jeg altid det antal byte tilbage som jeg initaliserer med:

    public byte[] getBinaryData(String entryName)
    {
        byte[] zipBytes = new byte[0];
        try
        {
            boolean found = false;
            ZipInputStream zipReader = new ZipInputStream(new FileInputStream(file));
            ZipEntry zip;
           
            while (zipReader.available() != 1 && !found)
            {
                zip = zipReader.getNextEntry();
               
                if (zip.getName().equals(entryName))
                {
                    Long totalBytes = new Long(zip.getSize());
                    zipBytes = new byte[totalBytes.intValue()];
                    zipReader.read(zipBytes, 0, totalBytes.intValue());
                    found = true;
                }
               
                /*if (zip.getName().equals(entryName))
                {
                  zipBytes = new byte[(int)zip.getSize()];
                  zipReader.read(zipBytes);
                  found = true;
                } */
            }
        }
        catch (Exception e)
        { }
        return zipBytes;
    }
Avatar billede netsrac Praktikant
08. september 2001 - 10:51 #9
Nå jeg smider lidt flere point på, den returnerer godt nok den første, men ikke de næste filer

Mit testprogram:

public class zipTest
{
    public static void main(String args[])
    {
        cnhwebZip zip = new cnhwebZip();
        zip.open(\"c:\\\\hotel.zip\");
        String[] list = zip.list();
        System.out.println(list.length);
        for (int i = 0; i < list.length; i++)
        {
            byte[] test = zip.getBinaryData(list[i]);
            System.out.println(test.length + \" Bytes\");
        }
        zip.close();
    }
}

Mit program:

import java.util.zip.*;
import java.util.Enumeration;
import java.util.Vector;
import java.io.*;


public class cnhwebZip
{
    private boolean fileOpen;
    private ZipFile myzip;
    private String file;
   
    public void cnhwebZip()
    {
        fileOpen = false;
    }
   
    private void reset()
    {
        close();
        open(file);
    }
   
    public boolean open(String file)
    {
        try
        {
            myzip = new ZipFile(file);
            fileOpen = true;
            this.file = file;
        }
        catch (Exception e)
        { }
        return fileOpen;
    }
   
    public boolean close()
    {
        try
        {
            myzip.close();
            fileOpen = false;
        }
        catch (Exception e)
        { }
        return fileOpen;
    }
   
    public int size()
    {
        if (fileOpen == true)
            return myzip.size();
        else
            return 0;   
    }
   
    public String[] list()
    {
        Vector mylist = new Vector();
        try
        {
            for (Enumeration e = myzip.entries(); e.hasMoreElements();)
            {
                mylist.addElement(e.nextElement());
            }
        }
        catch (Exception e)
        { }
        String[] finalList = new String[mylist.size()];
        for (int i = 0; i < mylist.size(); i++)
        {
            finalList[i] = ((ZipEntry) mylist.get(i)).getName();
        }
        return finalList;
    }
    public byte[] getBinaryData(String entryName)
    {
        byte[] zipBytes = new byte[0];
        reset();
        try
        {
            ZipInputStream zipReader = new ZipInputStream(new FileInputStream(file));
            ZipEntry zip;
            for (Enumeration e = myzip.entries(); e.hasMoreElements();)
            {
                    zip = zipReader.getNextEntry();
                    if (zip.getName().equals(entryName))
                    {
                        Long totalBytes = new Long(zip.getSize());
                        byte[] readBytes = new byte[totalBytes.intValue()];
                        zipReader.read(readBytes, 0, totalBytes.intValue());
                        return readBytes;
                    }
            }
        }
        catch (Exception e)
        { }
        return zipBytes;
    }
   
    public boolean extractToFile(String entryName, String path)
    {
        boolean ok = false;
        try
        {
            File targetFile = new File(path + entryName);
            FileOutputStream out = new FileOutputStream(targetFile);
            out.write(getBinaryData(entryName));
            ok = true;
        }
        catch (Exception e)
        { }
        return ok;
    }
}




Ved godt det er en ordentlig smøre, men håber i vil hjælpe mig, er ikke så stærk i java endnu.
Avatar billede netsrac Praktikant
09. september 2001 - 16:06 #10
Damn jeg har været en spade, jeg får jo InputStream foræret fra ZipFile, sådan her har jeg løst det:

    public byte[] getBinaryData(String entryName)
    {
        byte[] zipBytes = new byte[0];
        try
        {
            ZipEntry zip = myzip.getEntry(entryName);
            InputStream zipReader = myzip.getInputStream(zip);
            Long totalBytes = new Long(zip.getSize());
            byte[] readBytes = new byte[totalBytes.intValue()];
            zipReader.read(readBytes, 0, totalBytes.intValue());
            return readBytes;
        }
        catch (Exception e)
        { }
        return zipBytes;
    }


Så er der en lille ting, den kan ikke finde ud af det når der er navne med æøå, hvordan løser man det ?
Avatar billede logical Nybegynder
10. september 2001 - 07:39 #11
Fortæl mig hvordan du påviser problemer med æøå, altså er det navne inde i din zip fil, der ikke vises ordentlig på skærmen, eller hvordan?
Avatar billede netsrac Praktikant
10. september 2001 - 07:44 #12
Se jeg har denne public String[] list() der returnerer et array til mit testprogram, looper jeg igennem det og bruger min public byte[] getBinaryData(String entryName) med entryName fra mit array, så får jeg 0 byte tilbage når en fil i zip filen indeholder æøå i navnet.
Avatar billede logical Nybegynder
10. september 2001 - 07:51 #13
Kig på karakterne du får fra både den ene og den anden, og find ud af hvilken, der fejler.

Lidt ala:

String s = .....someStringMaybeWithAnÆ

int x = s.indexOf(\'æ\');
if (x != -1) {
  char ch = s.charAt(x);
  System.out.println(\"Dette æ er = \" + (int) ch);
}

Både din String[] list og zip.getName()skulle returnere samme værdi, så hvilken en af dem er det?
Avatar billede netsrac Praktikant
10. september 2001 - 07:55 #14
Måske du lige skulle se hvad ej siger her http://www.eksperten.dk/spm/107662

Det må altså være min getBinaryData som fejler fordi den ikke kan finde ud af det.
Avatar billede logical Nybegynder
10. september 2001 - 08:05 #15
Tja, ericjacobsen har tilsyneladende set problemet før, så jeg vil ikke sige mere til det. Det er sandsynligvis rigtigt.
Avatar billede netsrac Praktikant
10. september 2001 - 12:08 #16
Nå i deler :)
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