2013-03-20 2 views
2

Я консультировался с этим сообществом уже несколько раз, но, тем не менее, кажется, я все еще не в состоянии решить свои проблемы самостоятельно.FileInputStream, FileOutputStream - проверить файл для определенного значения/строки/строки

Моя последняя проблема заключается в следующем:

У меня есть файл, созданный в частном хранения приложения (некорневого устройства). Я могу писать и читать. НО: Я не знаю, как добавить дополнительную информацию в свой файл (я думаю, что другой FOS легко добавит массив в конце первого, но я не уверен), и я понятия не имею, как я могу смотреть для конкретной, например, String.

public static Runnable cfgsetlanecount(int l1, int l2, int l3, int l4, 
     int l5, int l6, int l7, int l8, Context context) 

     throws IOException { 
    System.out.println("" + l1 + l2+ l3+l4+l5+l6+l7+l8); 
    FileOutputStream fos = context 
      .openFileOutput(cfg, Context.MODE_PRIVATE); 
    String lanecount = "lanecount: " + (Integer.valueOf(l1).toString()) 
      + "" + (Integer.valueOf(l2).toString()) + "" 
      + (Integer.valueOf(l3).toString()) + "" 
      + (Integer.valueOf(l4).toString()) + "" + l5 + "" + l6 + "" 
      + l7 + "" + l8; 
    byte buf[] = lanecount.getBytes(); 
    fos.write(buf); 
    fos.close(); 
    cfggetlanecount(); 
    return null; 
} 

public static Runnable cfggetlanecount() throws IOException { 
    String collected = null; 
    FileInputStream fis = context.openFileInput(cfg); 
    byte input[] = new byte [fis.available()]; 
    while (fis.read(input)!=-1){ 
     collected = new String (input); 

     System.out.println(collected); 
    }fis.close(); 
    return null; 

} 

Это код того, что я сделал до сих пор. Я хочу добавить строку time со значением 12:00 и прочитать их в форме разных методов. Lanecount Строка имеет значение 10101010 Я просто хочу эти значения, говоря, поиск строки lanecount: и получите 12:00, говоря, поиск строки time:

EDIT:

Прежде всего это должно быть добавлена ​​линия в мой файл. Это то, что он должен выглядеть следующим образом:

line1: lanecount: 10001000

line2 Время: 12:00

line3: TIMEX: 5:00

строка4: ANYWORD: fhfbjklös

line5: Stopbyte: 0x28

. . .

и теперь мне нужен метод, который может вынуть значение ключевого слова timex или другое, которое может читать lanecount. И, возможно, тот, который может получить значение Stopbyte.

Тогда мне нужен метод, который способен ИЗМЕНИТЬ значение времени Ключевого слова.

+1

Если вы хранения символов в файле, я хотел бы предложить вам обернуть потоки в InputStreamReader и OutputStreamWriter. Вы также должны обернуть свои потоки в BufferedReader/BufferedWriter или BufferedInputStream/BufferedOutputStream, чтобы вам не нужно было делать буферизацию самостоятельно. Используйте [java.io пакет (который содержит все эти классы)] (http://developer.android.com/reference/java/io/package-summary.html) в полной мере. –

+1

thx вам Logician я попробую, но это не решит проблему. – Ekonion

+1

'byte input [] = новый байт [fis.available()];' Существует специальное предупреждение об этом использовании в Javadoc для 'InputStream.available() '. – EJP

ответ

4

на основе содержимого файла, которую вы описали, это звучит как файл естественные свойства:

# This is a comment: 
lanecount=10001000 
time=12:00 
timex=05:00 
anyword=fhfbjklös 
Stopbyte=0x28 
... ... 

Использование java.util.Properties, он делает все грязную работу за вас:

# Write properties to private storage: 
FileOutputStream fos = context.openFileOutput(cfg, Context.MODE_PRIVATE); 
Properties props = new Properties(); 
props.setProperty("lanecount", "10001000"); 
props.setProperty("time", "12:00"); 
prop.store(fos, "This is a comment"); // store() is threadsafe 
fos.close(); 

... ... 

# Read properties from private storage: 
FileInputStream fis = context.openFileInput(cfg); 
Properties props = new Properties(); 
props.load(fis); // load() is threadsafe 
fis.close(); 
String lanecount = props.getProperty("lanecount"); 
String time = props.getProperty("time"); 

Я не знаю, ваши требования, в качестве альтернативы, вы можете загрузить/сохранить свои конфигурации с SharedPreferences вместо собственного хранилища приложения:

# Write properties to shared preferences: 
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString("lanecount", "10001000"); 
editor.putString("time", "12:00"); 
editor.commit(); 

... ... 

# Read properties from shared preferences: 
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
String lanecount = prefs.getString("lanecount", "defauleValue"); 
String time = prefs.getString("time", "defauleValue"); 

Надеюсь, это поможет.

+0

omg, который действительно финишировал ... thx много, попробует ... кажется, именно то, что я искал – Ekonion

+0

отличный ответ, thx bounty награжден – Ekonion

+0

omnomnom ... bounty ... – Ekonion

0
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Properties; 

import android.content.Context; 
import android.os.Environment; 

import com.bowltec.own.OwnClass; 

public class Config_cbt extends OwnClass{ 
    static String cfg = "config.cbt"; 
    static int coll; 
    static Properties props; 

    public static void createcfg() throws FileNotFoundException, IOException { 
     String packageName = acti.getPackageName(); 
     String path = Environment.getExternalStorageDirectory() 
       .getAbsolutePath() + "/Android/data/" + packageName + "/files/"; 
     new File(path).mkdirs(); 
     props = new Properties(); 
    } 

    public static void cfgset(String key, String val) 
      throws IOException { 
     FileOutputStream fos = acti.openFileOutput(cfg, Context.MODE_PRIVATE); 
      props.setProperty(key, val); 
      props.store(fos, "..."); 
    } 

    public static int cfgget(String tocollect) throws IOException { 

     FileInputStream fis = context.openFileInput(cfg); 
     props.load(fis); 
     fis.close(); 
     String collected = props.getProperty(tocollect, "0"); 
     coll = Integer.valueOf(collected); 
     return coll; 
    } 
} 

Это как у меня сейчас. Это работает отлично. Это для всех тех, кто имеет проблемы по одному и тому же вопросу. Pls чувствует свободно использовать.

acti объявлен в моем OwnClass использовании protected static Activity acti; и acti = this;

Смежные вопросы