Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. MSDN имеет полное пример http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx использование класса ZipPackage. Требует.NET 3.5.
Dave, очень хороший!! Я не знал, что это было там.
Теперь, когда я знаю, что искать, я смог найти статью с маленьким примером кода о том, как использовать его: http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx
На связанной ноте, я также нашел проект DotNetZip, который выглядит чрезвычайно простым в использовании.
Да, я использовал его в прошлом. Я разделил на подклассы DataSet однажды для поддержки сохранения себя в файл (через ReadXML / метод WriteXML ). Как добавленная премия, я решил позволить этому быть, дополнительно, сжатым при желании (это, как необходимо уже знать, является чрезвычайно эффективным с текстовыми данными как XML).
я использовал класс GZipStream (это было мое понимание в то время, когда связанным DeflateStream был просто GZip без информации заголовка или некоторый такой — я уверен, что кто-то мог исправить меня на этом). Это работает вполне просто путем осуществления контрейлерных перевозок сверху другого потока, и таким образом Вы затем используете GZipStream в его месте. В моем случае это осуществляло контрейлерные перевозки на FileStream.
, Учитывая MemoryStream, чтобы быть заполненным выводом myDataSet.WriteXML()
, я сделал что-то как следующее:
if (CompressData)
{
// Write to memory
mStream = new MemoryStream();
Save(mStream);
mStream.Seek(0, SeekOrigin.Begin);
// Filter that through a GZipStream and then to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
FileMode.OpenOrCreate);
zipStream = new GZipStream(fStream, CompressionMode.Compress, true);
Pump(mStream, zipStream);
}
else
{
// Write straight to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
FileMode.OpenOrCreate);
Save(fStream);
}
, Где Save()
и Pump()
простые методы как следующее:
private void Pump(Stream input, Stream output)
{
int n;
byte[] bytes = new byte[4096]; // 4KiB at a time
while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
{
output.Write(bytes, 0, n);
}
}
public void Save(Stream stream)
{
AcceptChanges();
WriteXml(stream, XmlWriteMode.WriteSchema);
}
Вы захотите пользоваться сторонней библиотекой, как http://www.codeplex.com/DotNetZip , вместо того, чтобы пытаться использовать GZipStream или DeflateStream для чтения zip-файла.
*** Потоковые классы в.NET могут позволить Вам читать или записать сжатые потоки байтов. Эти классы НЕ читают или пишут zip-файлы. Zip-файл является сжатыми данными, окруженными "конвертом" или заголовком. Думайте о нем как о метаданных - это включает название файла, метки времени, CRC и набора другого материала. ** Потоковые классы производят только поток сжатых данных и не знают, как произвести или использовать метаданные, которые описаны в спецификации формата PKZip, сохраняемой PKWare.
Сторонние библиотеки как DotNetZip обрабатывают метаданные в архиве ZIP. Они могут или не могут использовать Систему. IO.Compression. DeflateStream () класс к произведенному сжатый поток байтов. В предыдущих выпусках, например, DotNetZip использовал встроенный DeflateStream. С v1.7 DotNetZip включает свой собственный DeflateStream, который более эффективен, чем тот, поставленный в Платформе.NET. Как дополнительное преимущество, встроенный DeflateStream в DotNetZip позволяет DotNetZip использоваться на.NET Компактная Платформа 2.0, который испытывает недостаток в Системе. IO.Compression. DeflateStream. (это было добавлено в Компактной Платформе 3.5)
существует хороший форум по сайту DotNetZip, если у Вас есть больше вопросов. Пример код C#:
try
{
using (ZipFile zip = new ZipFile())
{
zip.AddDirectory(DirectoryToZip); // recurses subdirs
zip.Save(Filename);
}
}
catch (System.Exception ex1)
{
System.Console.Error.WriteLine("exception: " + ex1);
}