2012-03-12 12 views
6

CSVReader'ı oluşturdum ve bu nedenle csv dosyasını varlıklardan okumaya çalışıyorum, bu nedenle InputStream'i kullanmalıyım. Ancak aşağıdaki kodumda girdi akışı kurucusu yok. Kodda bir şeyi nasıl ekleyebileceğimi veya değiştirebileceğimi söyleyen herkes olabilir, bu yüzden giriş akışını kullanabilirim.CSVReader ve InputStream

public class CSVReader { 

    private BufferedReader br; 

    private boolean hasNext = true; 

    private char separator; 

    private char quotechar; 

    private int skipLines; 

    private boolean linesSkiped; 

    public int linesCount = 0; 

    public static final char DEFAULT_SEPARATOR = '|'; 
    public static final char DEFAULT_QUOTE_CHARACTER = '"'; 
    public static final int DEFAULT_SKIP_LINES = 0; 

    public CSVReader(Reader reader) { 
     this(reader, DEFAULT_SEPARATOR, DEFAULT_QUOTE_CHARACTER, 
      DEFAULT_SKIP_LINES); 
    } 

    public CSVReader(Reader reader, char separator, char quotechar, int line) { 
     this.br = new BufferedReader(reader); 
     this.separator = separator; 
     this.quotechar = quotechar; 
     this.skipLines = line; 
    } 
    public String[] readNext() throws IOException { 

     String nextLine = getNextLine(); 
     return hasNext ? parseLine(nextLine) : null; 
    } 

    public String getNextLine() throws IOException { 
     if (!this.linesSkiped) { 
      for (int i = 0; i < skipLines; i++) { 
       br.readLine(); 
      } 
      this.linesSkiped = true; 
     } 
     String nextLine = br.readLine(); 
     if (nextLine == null) { 
      hasNext = false; 
     } 
     return hasNext ? nextLine : null; 
    } 


    public List<String[]> readAll() throws IOException { 

     List<String[]> allElements = new ArrayList<String[]>(); 
     while (hasNext) { 
      String[] nextLineAsTokens = readNext(); 
      if (nextLineAsTokens != null) 
       allElements.add(nextLineAsTokens); 
     } 
     return allElements; 

    } 

    private String[] parseLine(String nextLine) throws IOException { 

     if (nextLine == null) { 
      return null; 
     } 

     List<String> tokensOnThisLine = new ArrayList<String>(); 
     StringBuffer sb = new StringBuffer(); 
     boolean inQuotes = false; 
     do { 
      if (inQuotes) { 
       // continuing a quoted section, reappend newline 
       sb.append("\n"); 
       nextLine = getNextLine(); 
       linesCount++; 
       if (nextLine == null) 

        break; 
      } 
      for (int i = 0; i < nextLine.length(); i++) { 

       char c = nextLine.charAt(i); 
       if (c == quotechar) { 
        if(inQuotes 
         && nextLine.length() > (i+1) 
         && nextLine.charAt(i+1) == quotechar){ 
         sb.append(nextLine.charAt(i+1)); 
         i++; 
        }else{ 
         inQuotes = !inQuotes; 
         if(i>2 
           && nextLine.charAt(i-1) != this.separator 
           && nextLine.length()>(i+1) && 
           nextLine.charAt(i+1) != this.separator 
         ){ 
          sb.append(c); 
         } 
        } 
       } else if (c == separator && !inQuotes) { 
        tokensOnThisLine.add(sb.toString()); 
        sb = new StringBuffer(); 
       } else { 
        sb.append(c); 
       } 
      } 
     } while (inQuotes); 
     tokensOnThisLine.add(sb.toString()); 
     return (String[]) tokensOnThisLine.toArray(new String[0]); 

    } 

    public void close() throws IOException{ 
     br.close(); 
    } 

} 

cevap

15

Sen myInputStream senin InputStream ve encoding olduğunu inputStream

new InputStreamReader(myInputStream, encoding) 

bir InputStreamReader inşa edebilirsiniz veri kaynağı tarafından kullanılan kodlamayı tanımlayan bir String olduğunu.

Böyle senin CsvReader arayabilirsiniz:

new CSVReader(new InputStreamReader(myInputStream, encoding)); 
+1

Sen * Gerçekten should * Uygun [iki argüman yapıcı] (https://developer.android.com kullanarak okuma için kullanılacak kodlamayı belirtmek /reference/java/io/InputStreamReader.html#InputStreamReader(java.io.InputStream,%20java.lang.String)). –

+0

Bunun nasıl yapıldığını anlamıyorum. Daha özel olarak söyler misiniz lütfen. – fish40

+0

@JoachimSauer haklısınız, yanıtı güncellediniz – oers

İlgili konular